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 #