bash腳本語言是一種解釋性語言,執行時通過解釋器執行,不需要編譯。
一、變量
本地變量:使用格式為varname=值,本地變量的聲明周期為整個腳本程序
局部變量:使用格式為local varname=值,局部變量的聲明周期為整個腳本程序
環境變量:使用格式為export varname=值,作用域為目前shell程序及子程序。指令腳本在執行時,會啟動shell的子程序,指令行中啟動的腳本會繼承目前的shell環境變量,系統自動執行腳本(非指令行啟動)就需要自我定義環境變量
位置變量:$1,$2...表示引用的參數
shift:踢出參數 shift n:表示踢出n個參數
特殊變量:$?儲存了上一個指令執行的狀态傳回值(程式執行可能有兩類傳回值,一種是執行的狀态傳回值,一種是執行指令的傳回值),程式狀态傳回代碼:(0-255), 0:表示執行正确,1-255:都是錯誤的
撤銷變量:unset 變量名稱 eg:unset A
檢視目前shell中的變量:set
檢視目前shell中的環境變量:printenv,env,export
在原來的值後面補加一個值:
ANIMALS=pig
ANIMALS=$ANIMALS:gost
執行結果:pig:gost
二、算術運算
使用let指令做運算:let C=$A+$B
$[算數運算表達式]:C=$[$A+$B]
$((運算表達式)): C=$(($A+$B))
expr算數運算表達式,表達式中各操作及運算符之間要有空格,而且要使用反引号将指令引用(輸入法切換到英文,波浪号鍵即為反引号鍵):
C=`expr $A + $B`
三、條件測試
條件測試類型:
整數測試,字元測試,檔案測試
3種測試指令:
test 表達式 eg: if test $A -eq $B;then echo "deng"; else echo "budeng"; fi
[ 表達式 ] eg: if [ $A -eq $B ];then echo "deng"; else echo "budeng"; fi
[[ 表達式 ]] eg: if [[ $A -eq $B ]];then echo "deng"; else echo "budeng"; fi
注意:後兩種表達式前後必須有空格
數值測試:
-eq:是否相等
-ne:是否不等
-ge:是否大于等于
-le:是否小于等于
-gt:是否大于
-lt:是否小于
字元串測試:
=或==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左側字元串是否能夠被右側PATTERN所比對 [[ ]]中使用
-z "STRING":測試字元串是否為空,空則為真
-n "STRING":測試字元串是否非空,不空則為真
注意:用于字元串比較時用到的操作數都應該使用引号括起來
檔案測試:
存在性測試:
-a FILE:同下
-e FILE:檔案存在性測試,存在為真,否則為假
存在性及類别測試:
-b FILE:是否存在且為塊裝置檔案
-c FILE:是否存在且為字元裝置檔案
-d FILE:是否存在且為目錄檔案
-f FILE:是否存在且為普通檔案
-h FILE 或-L FILE:是否存在且為符号連結檔案
-p FILE:是否存在且為命名管道檔案
-S FILE:是否存在且為套接字檔案
檔案權限測試:
-r FILE:是否存在且可讀
-w FILE:是否存在且可寫
-x FILE:是否存在且可執行
檔案特殊權限測試:
-g FILE:是否存在且擁有sgid權限
-u FILE:是否存在且擁有suid權限
-k FILE:是否存在且擁有sticky權限
檔案大小測試:
-s FILE:是否存在且非空
檔案是否打開:
-t fd:fd表示檔案描述符是否已經打開且與某終端相關
其它:
-N FILE:檔案自從上一次被讀取之後是否被修改過
-O FILE:目前有效使用者是否為檔案屬主
-G FILE:目前有效使用者是否為檔案屬組
雙目測試:
FILE1 -ef FILE2:FILE1與FILE2是否指向同一個裝置上的相同inode
FILE1 -nt FILE2:FILE1是否新于FILE2
FILE1 -ot FILE2:FILE1是否舊與FILE2
組合條件測試:
邏輯運算:
[ ]中使用:
EXPRESSION1 -a EXPRESSION2:2個條件同時為真,則結果為真
EXPRESSION1 -o EXPRESSION2:2個條件中其中一個條件為真,則結果為真
! EXPRESSION:條件為假時,則結果為真
[[ ]]或[ ] ** [ ]中使用: 注:**為&&或||
&&: 左右兩邊條件或指令同時為真,則結果為真
||:左右兩邊條件或指令其中一個為真時,則結果為真
!:條件或指令為假時,則結果為真
注:[ ]中使用小括号需要轉義即\(\),[[ ]]則無需轉義
四、條件判斷控制結構
單分支的if語句:
if 判斷條件; then
statement1
statement2
fi
雙分支的if語句:
if 判斷條件; then
statement1
statement2
else
statement3
statement4
fi
多分支的if語句
if 判斷條件;then
statement1
...
elif 判斷條件;then
statement2
...
elif 判斷條件;then
statement3
...
else
statement4
...
fi
五、case分支選擇結構
case $變量 in
值1)指令 ;;
...
值n)指令 ;;
*) 預設指令;;
esca
注意每個條件末尾都是兩個分号。
bash分支選擇結構當中沒有break,但是兩個分号就代表break的含義。c語言中每個條件(case語句)後面不一定都要有break,如果沒有break,則繼續執行下面的條件的語句,即多個分支共用一組語句。如果你想在bash中像c語言那樣多個條件共用一套語句,可以在分支末尾使用一個分号加一個and符号,eg:
case $ans in
y);&
Y) echo "我也是";;
n);&
N) echo "sorry,跟你沒什麼好談的";;
esac
除了 ;&結束語句以外,還有一種是 ;;& 來結束語句的用法。但是意義有所不同,;;&的用法是使得條件越來越精确。
eg:
case $num in
*)echo -n "中國";;&
03*)echo -n "河北省";;&
??10)echo "邯鄲市";;
??11)echo "石家莊";;
??17)echo "滄州市";;
07*)echo -n "江西省";;&
??91)echo "南昌市";;
??92)echo "九江市";;
??97)echo "贛州市";;
esac
六、循環控制結構
for 變量 in 清單;do //形式1 eg:for i in {1..20} ; do
表達式 echo $i
done done
for ((expr1;expr2;expr3));do //形式2,近似于C語言
表達式
done
while CONDTION;do
表達式
done
進入循環,條件滿足
退出條件,條件不滿足
until CONDITION;do
表達式
done
進入循環,條件不滿足
退出循環,條件滿足
在while,until , for循環結構中
break:提前退出循環
continue:提前進入下一輪循環
七、函數
函數是實作結構化程式設計重要的思想,主要目的是實作代碼重用
定義一個函數:
function FUNCNAME //形式1
{
函數體
}
FUNCNAME() //形式2,函數名緊跟小括号不能加空格
{
函數體
}
調用隻需要使用函數名即可
bash -x 腳本名 檢視腳本執行的過程
注意:函數的執行結果和函數的執行狀态結果是不同的
引用函數的執行結果:變量=`函數名`
引用函數的狀态結果:函數調用之後 echo $?
腳本的執行狀态結果取決于執行的最後一個指令
自定義執行狀态傳回值 return #