linux-shell編程9:shell腳本編寫

腳本語言

腳本語言(script language)
相對於編譯型語言而言
編譯語言:語言編寫——>編譯——>鏈接——>運行
腳本語言縮減了編譯型語言的過程
底層處理數據:字節/ 整數/ 浮點數/機器層的對象

編譯語言:C、C++,Java,PYTHON,C#  
腳本語言執行一般爲解釋性語言,通過解釋器讀入腳本程序,轉爲內部形式進行執行
解釋器本身就是一個編譯型的程序

shell腳本

shell腳本語言是linux/類unix系統上的重要的腳本語言,在*nix領域運用極爲廣泛,通過shell腳本語言可以將繁瑣的事情簡單實現

shell腳本優勢

簡單,易學,適合處理文件和目錄之類的對象
以簡單的方式完成複雜的操作
    1.語法和結構通常比較簡單
    2.學習和使用通常比較簡單
    3.通常以容易修改程序的“解釋”作爲運行方法,不需要“編譯”
    4.程序的開發產能優於運行效能

#腳本語言的執行效率不如編譯型語言

編寫自己的第一個腳本

shell腳本的基本元素
[root@server0 ~]# cat everyday.sh 
#!/bin/bash
cd 
. .bash_profile
date
who
[root@server0 ~]# 

#!  符號稱爲"sha-bang"符號,是shell腳本的起始符號
#!  符號是指定一個文件類型的特殊標記,它告訴linux系統這個文件執行需要指定   一個解釋器
#!  符號之後是一個路徑,這個路徑指明解釋器在系統中的位置
shell腳本語言解釋器一般爲bash/sh     sed/awk
命令是shell腳本的基本元素,命令通常由命令名稱,選項,參數三部分組成

# 儀式感   打印屬於shell腳本的hello world
[root@server0 programe]# vim hello.sh
[root@server0 programe]# chmod u+x hello.sh 
[root@server0 programe]# ./hello.sh 
Hello World
[root@server0 programe]# echo $?
0
[root@server0 programe]# cat hello.sh 
#!/bin/bash
# #代表註釋.
#This is shell script first programe.
#This program is print "Hello world".
#Author:daochang
#Date:"2018-11-28"
#Version:0.1
echo "Hello World"
exit 0

執行shell腳本

1.賦予權限,直接運行腳本
    chmod u+x  *.sh
    ./*.sh
2.沒有權限,通過bash或sh運行

    bash  *.sh
    sh   *.sh

3.沒有權限,通過source 或者 .  運行腳本
    source *.sh
    .  *.sh

   不同執行方法的區別在於,賦予腳本權限後直接運行腳本將在用戶當前shell下開啓一個新的子進程,並在子進程中運行腳本程序
通過bash、sh、./ 命令加載並執行,此時系統將不在關心#!後面的解釋器,而是直接使用bash作爲解釋器解釋腳本內容並執行
通過 .  或source方法執行腳本,則腳本將在用戶當前shell環境下運行

練習

#製作程序菜單
[root@server0 programe]# cat menu.sh 
#!/bin/bash
#This is a meun script
clear
#清空屏幕
echo "*****************************************"
echo -e "*\033[1;31m\t\tMenu\t\t\033[0m\t*"
#echo -e 開啓轉義功能
#\033[1,31m  顏色輸出  1爲樣式與前景色,31爲字體顏色   \033[0m  關閉顏色設置
echo "*****************************************"
echo "1.Display system CPU info and system load"
echo "2.Display system Men info and swap info"
echo "3.Display filesystem mount info"
echo "4.Display system network interface info"
echo "5.EXIT"
[root@server0 programe]# 

#統計基本信息
#利用命令堆積方式,對腳本排版格式不做任何處理
[root@server0 programe]# cat sysinf.sh 
#!/bin/bash
#This script can be used to collect system basic infomation.
echo "………………………………………………………………………………………………………………………………"
echo "Display CPU info"
echo $(cat /proc/cpuinfo  | grep 'model name')
echo "………………………………………………………………………………………………………………………………"
echo "Display system load!"
echo $(uptime)
echo "………………………………………………………………………………………………………………………………"
echo "Display  swap info:"
echo $(free | grep wap)
echo "………………………………………………………………………………………………………………………………"
echo "Display filesystem mount info"
echo $(df -hT | grep 'boot')
echo "………………………………………………………………………………………………………………………………"
echo "Display network interface info:"
echo $(ip addr show| grep inet)
echo "………………………………………………………………………………………………………………………………"

#利用變量
#打印環境變量
[root@server0 programe]# cat aver.sh 
#!/bin/bash
#
#利用$可以在腳本中引用環境變量
echo "user info for userid:$USER"
echo UID:$UID
echo HOME:$HOME
[root@server0 programe]# 

#添加用戶變量
[root@server0 programe]# cat user_var.sh 
#!/bin/bash
#test variables
days=10
guest='dana'
echo "$guest checked in $days days ago"
days=5
guest="huanglaobam"
echo "$guest checked in $days days ago"
[root@server0 programe]# 

[root@server0 programe]# vim user_var2.sh 
[root@server0 programe]# source user_var2.sh 
result is 10
[root@server0 programe]# cat user_var.sh 
#!/bin/bash
#test variables
value1=10
value2=$value1

echo The result value is $value2
[root@server0 programe]# cat user_var2.sh 
#!/bin/bash
a=10
b=$a
echo result is $b
[root@server0 programe]# 

#反引號
shell腳本中反引號,
反引號允許將shell命令的輸出賦值給變量
準確的說,必須將整個命令用反引號包圍起來

[root@server0 programe]# cat fanyinhao.sh 
#!/bin/bash
test=`date`
echo $test
[root@server0 programe]# 

#使用反引號捕捉當前日期,並用他在腳本中創建唯一的文件名
[root@server0 programe]# cat fyh.sh 
#!/bin/bash
#copy the /usr/bin listing to a log file
today=`date +%y%m%d`
echo today is $today
ls -la /usr/bin > log.$today
[root@server0 programe]# 

#數學計算
[root@server0 programe]# cat math1.sh 
#!/bin/bash
#an example of using the expr comand
var1=10
var2=20
var3=`expr $var2 / $var1`
echo The reslut is $var3
[root@server0 programe]# 

#利用括號進行數學運算
[root@server0 programe]# cat math2.sh 
#!/bin/bash
var1=10
var2=50
var3=45
var4=$[$var1*($var2-$var3)]
echo The reslut is $var4
[root@server0 programe]# 

#利用bc進行數學運算
[root@server0 programe]# cat math3.sh 
#!/bin/bash
var1=`echo "scale=4;3.44 / 5" | bc`
echo The result is $var1
[root@server0 programe]# 

#
[root@server0 programe]# cat math4.sh 
#!/bin/bash
var1=10
var=3.1415936
var3=`echo "scale=4;$var1*$var1" | bc`
var4=`echo "scale=4;$var3*$var2"| bc`
echo The reslut is $var4
[root@server0 programe]#

#EOF文本字符串表明內置重定向數據的開始和結尾
[root@server0 programe]# cat  math5.sh 
#!/bin/bash
var1=10.55
var2=3.66
var=32.4
var4=98
var5=`bc << EOF
scale=4
a1=($var1*$var2)
b1=($var3*$var4)
a1+b1
EOF
`
echo The final reslut is $var5
[root@server0 programe]# 

#退出狀態    $?
[root@server0 programe]# cat exit_status.sh 
#!/bin/bash
#test the exit status
var1=10
var2=30
var3=$[$var1*$var2]
echo The reslut is $var3
exit $var3
[root@server0 programe]# 

#退出狀態碼最高255
0-255
通過模計算得到狀態碼
一個值的模是除操作之後餘數,運算結果就是哪個特定的數被256除了之後的餘數,本例結果爲300

shell腳本的注意事項

1.開頭解釋器  #!/bin/bash
2.語法縮進,使用四個空格
3.多加註釋
4.命名規則:變量名大寫,函數名小寫,命名要有意義
5.默認變量是全局的,在函數中變量local指定爲局部變量
6.一定先測試在投入到生產環境
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章