說明:本文是對Vamei知乎文章《快速學習Bash》(zhuanlan.zhihu.com/p/32)一文的學習筆記,根據個人理解調整了內容順序,補充了一些注釋和說明等內容。

4.2 數學運算

在Bash中,數字和運算符都被當做普通文本。所以你無法像C語言一樣便捷地進行數學運算。比如執行下面的命令:

result=1+2
$echo $result

Bash並不會進行任何運算。它只會列印文本「1+2」。

在Bash中,你可以通過「$(())」語法來進行數值運算。在雙括弧中你可以放入整數的加減乘除表達式。Bash會對其中的內容進行數值運算。比如:

echo $((2 + (5*2)))
#不能寫成result=((2+5*2)),賦值符號似乎不能識別雙括弧,正確的的寫法是result=$((2+5*2))

將列印運算結果12。此外,在$(())中,你也可以使用變數。比如:

$var=1
echo $(($var+(5*2)))

將列印運算結果11。

我們可以用Bash實現多種整數運算:

加法:$(( 1 + 6 ))。結果為7。減法:$(( 5 – 3 ))。結果為2。乘法:$(( 2*2 ))。結果為4。除法:$(( 9/3 ))。結果為3。求餘:$(( 5%3 ))。結果為2。乘方:$(( 2**3 ))。結果為8。

可以把數學運算結果存入變數:

result=$(( 1 + 2 ))
echo $result

4.3 返回代碼

在Linux中,每個可執行程序會有一個整數的返回代碼。按照Linux慣例,當程序正常運行完畢並返回時,將返回整數0。在Shell中,我們運行了程序後,可以通過$?變數來獲知返回碼。

如果一個程序運行正常,那麼這個程序將返回0,。

如果一個程序運行異常,那麼這個程序將返回非0的返回代碼

比如刪除一個不存在的文件:

rm none_exist.file
echo $? #返回值為1

在Linux中,可以在一個行命令中執行多個程序。比如:

touch demo.file; ls;

在執行多個程序時,我們可以讓後一個程序的運行參考前一個程序的返回代碼。比如說,只有前一個程序返回成功代碼0,才讓後一個程序運行:

rm demo.file && echo "rm succeed" #雙&代表前一句命令順利執行後再執行後一個命令
如果rm命令順利運行,那麼第二個echo命令將執行。

還有一種情況,是等到前一個程序失敗了,才運行後一個程序,比如:

rm demo.file || echo "rm fail" #雙豎線代表若果前一個命令執行失敗,才執行第二個命令
如果rm命令失敗,第二個echo命令才會執行。

4.4 Bash腳本

還可以把多行的Bash命令寫入一個文件,成為所謂的Bash腳本。當Bash腳本執行時,Shell將逐行執行腳本中的命令。編寫Bash腳本,是我們開始實現Bash代碼復用的第一步。

1)腳本的例子

用文本編輯器編寫一個Bash腳本hello_world.bash:

#!/bin/bash #說明瞭該腳本使用的shell的具體位置,這裡的是/bin/bash即Bash程序
echo Hello
echo World #這兩行代碼也可以一行 echo 「Hello${IFS}World"

腳本的第一行說明瞭該腳本使用的Shell,即/bin/bash路徑的Bash程序。腳本正文是兩行echo命令。運行腳本的方法有兩種:

# 方法1
bash hello_world.bash
# 方法2
chmod u+x hello_world.bash
./hello_world.bash

#需要注意的是,如果用戶不具有執行Bash腳本文件的許可權,那麼他將無法執行Bash腳本。
#此時,用戶必須更換文件許可權,或者以其他身份登錄,才能執行腳本。
#當腳本運行時,兩行命令將按照由上至下的順序依次執行。Shell將列印兩行文本:
Hello
World

Bash腳本是一種復用代碼的方式。我們可以用Bash腳本實現特定的功能。由於該功能記錄在腳本中,因此我可以反覆地運行同一個文件來實現相同的功能,而不是每次想用的時候都要重新敲一遍命令。我們看一個簡單的Bash腳本hw_info.bash,它將計算機的信息存入到名為log的文件中:

#!/bin/bash

echo "Information of Vameis computer:" > log #">"代表定向輸出到log文件
lscpu >> log # ">>"代表追加到log文件末尾
uname –a >> log
free –h >> log

2)腳本參數

和可執行程序類似,Bash腳本運行時,也可以攜帶參數。這些參數可以在Bash腳本中以變數的形式使用。比如test_arg.bash:

#!/bin/bash

echo $0 #顯示變數0 變數0一般就是腳本名
echo $1 #顯示變數1 變數1一般是腳本後的第一個參數,之後依次類推
echo $2 #顯示變數2

在Bash中,你可以用$0、$1、$2……的方式,來獲得Bash腳本運行時的參數。我們用下面的方式運行Bash腳本:

bash test_arg.bash hello world

$0是命令的第一部分,也就是test_arg.bash。$1代表了參數hello,而$2代表了參數world。因此,上面程序將列印:

test_arg.bash
hello
world

如果變更參數,同一段腳本將有不同的行為。這大大提高了Bash腳本的靈活性。上面的hw_info.bash腳本中,我們把輸出文件名寫死成log。我們也可以修改腳本,用參數作為輸出文件的文件名:

#!/bin/bash

echo "Information of Vameis computer:" > $1
lscpu >> $1
uname –a >> $1
free –h >> $1

藉助參數,我們就可以自由地設置輸出文件的名字:

bash hw_info.bash output.file

3)腳本的返回代碼

和可執行程序類似,腳本也可以有返回代碼。還是按照慣例,腳本正常退出時返回代碼0。在腳本的末尾,我們可以用exit命令來設置腳本的返回代碼。我們修改hello_world.bash:

#!/bin/bash

echo Hello
echo World
exit 0 #設置腳本返回代碼為0, 其實默認自動返回為0

其實在腳本的末尾加一句exit 0並不必要。一個腳本如果正常運行完最後一句,會自動的返回代碼0。在腳本運行後,我們可以通過$?變數查詢腳本的返回代碼:

bash hello_world.bash
echo $?

如果在腳本中部出現exit命令,腳本會直接在這一行停止,並返回該exit命令給出的返回代碼。比如下面的demo_exit.bash:

#!/bin/bash

echo hello
exit 1
echo world

你可以運行該腳本,檢查其輸出結果,並查看其返回代碼。


推薦閱讀:
相關文章