shell 語法介紹

2023-11-13 18:00:38

大家好,我是藍胖子,在日常開發中或多或少都會接觸到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 語句

瞭解了判斷語句就可以看看跳轉指令的語法,首先我們看下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 while迴圈語句

for 語法結構

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 語法結構

while expression 
do 
	command 
done

表示式的語法也和之前if 語句那裡講的語法結構類似,這裡就不再展開了。

總結

這一節簡單的介紹了shell最基本的語法,掌握了這些,便可以簡單的寫一些最基本的指令碼了。函數的宣告和呼叫可以等用到的時候再學,後續也會介紹一些shell指令碼的實際案例來鞏固下這部分的內容。