大家好,我是藍胖子,在日常開發中或多或少都會接觸到shell指令碼,可以說會shell指令碼是一位後端開發的基本功,今天我將會花上一篇文章總結下常見的shell的語法,學完本篇,相信簡單的shell指令碼就能夠看懂了,一些比較高階的語法可以遇到的時候再去學習。
我認為學習一門程式語言語法的時候,最基本的無外乎就是語言中的型別定義,以及迴圈或if else等跳轉指令,懂了這兩個以後,便能寫一些簡單的邏輯了。所以shell語言也不例外,我也會從這兩個角度去介紹。
首先看下shell中對變數的定義,其中分為環境變數和區域性變數。
環境變數在子shell程序中是可見的,可以通過export 關鍵字進行定義,如下所示,
[root@localhost ~]# export VAR=value
區域性變數是指在某個shell中生效的變數,這個變數在其他shell中是無效。
變數的定義可以通過如下方式進行定義,
變數名=變數值,
[root@localhost ~]# name=john
注意點一:變數名和變數值之間用等號緊緊相連,之間沒有任何空格
注意點二:當變數中有空格時必須用引號(單引號,雙引號都可以)括起,否則會出現錯誤
定義了變數,那麼如何對其進行參照呢?可以通過如下方式對變數進行參照,
在變數前面加上$ 符號即可。
(base) ➜ ~ name=lanpangzi
(base) ➜ ~ echo $name
lanpangzi
更標準點的寫法是用${}將變數名括起來。
(base) ➜ ~ echo ${name}
lanpangzi
除了通過${變數名} 方式參照變數,還可以通過 $數位 方式獲取shell指令碼的引數,$0 代表第一個引數,$1 代表第二個引數,依次類推。 另外 $# 代表引數的個數, $* 或者 $@代表所有引數,例如我寫一個指令碼 輸出這些變數。
指令碼如下,
!/bin/sh
echo "第一個引數: $0"
echo "第二個引數: $1"
echo "所有引數: $@"
echo "引數個數: $#"
執行這個指令碼
(base) ➜ ~ sh print.sh wudi lanoangzi
print.sh: line 1: !/bin/sh: No such file or directory
第一個引數: print.sh
第二個引數: wudi
所有引數: wudi lanoangzi
引數個數: 2
注意下shell指令碼中單引號和雙引號的區別,如果要讓輸出的語句中參照變數,那麼要用雙引號。
另外,在shell指令碼中還有個經常用到的型別,陣列,與其他語言不同的是,shell指令碼中的資料只支援一維陣列。
陣列的定義方式如下,
declare 關鍵字定義陣列,其中元素用()括起來,並且元素之間用空格隔開。
declare arr1=(元素1 元素2)
陣列中的元素參照方式如下,
echo ${陣列名[索引號]}
比較特殊的是可以通過 ${陣列名[@]} 或者 ${陣列名[*]} 獲取陣列中的 元素, 可以通過 ${#陣列名[@]} 或者 ${#陣列名[*]} 獲取陣列的長度。
對陣列中元素替換和新增陣列元素可以按如下操作,
對指定位置的變數進行替換
陣列名[索引值]=30
假設陣列名是arr,對陣列末尾進行元素新增,
arr[${#arr[@]}]=30
看了變數的定義,我們再來看看shell指令碼中的跳轉指令,在學跳轉指令前還需要對shell中如何對錶示式獲取表示式的結果有所瞭解,因為一般跳轉指令都是條件跳轉,像if else之類的語句,總有個判斷條件。
在shell中可以通過$? 獲取上一個shell語句的執行結果,shell命令中規定0才是命令正確執行後的返回結果,其餘結果都是不正確的。
讓表示式執行比較邏輯的方式有兩種,
1, 第一種是通過test expression 的方式,test後面跟表示式,如下所示,比較了兩個數位是否相等,返回1說明相等。
(base) ➜ ~ test 1 -eq 2
(base) ➜ ~ echo $?
1
2, 第二種方式是使用[] 把表示式括起來,這種方式注意[] 內變數需要與括號相隔一個空格才行。
(base) ➜ ~ [ 1 -eq 2 ]
(base) ➜ ~ echo $?
1
接著來看下shell中如何對字串進行比較,
字串的比較是可以用> < 這種符號的,數位則不同。
除了數位和字串的比較,我們平時還經常會用到對檔案的判斷,比如判斷檔案是否存在等,如下是對檔案相關操作的判斷。
瞭解了判斷語句就可以看看跳轉指令的語法,首先我們看下if語句在shell中是如何寫的。
if expression; then
command
fi
通過if then fi三個關鍵字組成了最簡單的if語句,其中expression則是前面講到的判斷語句的表示式,如下,執行這個指令碼將會輸出,123 和456兩行資料。
!/bin/sh
num=1
if test $num -eq 1 ;then
echo 123
fi
if [ $num -eq 1 ] ;then
echo 456
fi
if else 語句也類似,它的語法結構如下,
if expression; then
command
else
command
fi
for VARIABLE in (list)
do
command
done
for語句可以遍歷一個列表然後對其中每一個元素進行遍歷。上述語法中,list既可以是變數也可以是固定陣列表示式,也可以命令輸出。
案例1,陣列變數 迴圈
!/bin/sh
arr="1 2 3 4"
for num in ${arr}
do
echo $num
done
案例2,固定陣列表示式迴圈
!/bin/sh
for num in 1 2 3 4
do
echo $num
done
案例3,命令輸出結果 迴圈
!/bin/sh
for num in $(ls)
do
echo $num
done
while expression
do
command
done
表示式的語法也和之前if 語句那裡講的語法結構類似,這裡就不再展開了。
這一節簡單的介紹了shell最基本的語法,掌握了這些,便可以簡單的寫一些最基本的指令碼了。函數的宣告和呼叫可以等用到的時候再學,後續也會介紹一些shell指令碼的實際案例來鞏固下這部分的內容。