天天看點

bash 腳本_Bash技巧:使用 set 内置指令幫助調試 shell 腳本set 指令使用 set -e 選項在遇到報錯後停止執行使用 set -x 選項打開調試開關使用 set -v 回顯所輸入的指令

bash 腳本_Bash技巧:使用 set 内置指令幫助調試 shell 腳本set 指令使用 set -e 選項在遇到報錯後停止執行使用 set -x 選項打開調試開關使用 set -v 回顯所輸入的指令

在 Linux bash shell 中,可以使用 set 内置指令設定和檢視 shell 的屬性。

這些屬性會影響 shell 的不同行為。

下面對一些常用的屬性進行說明。

set 指令

檢視 help set 對 set 指令的說明如下:

set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

Change the value of shell attributes and positional parameters, or display the names and values of shell variables.

Using + rather than - causes these flags to be turned off.

即,set 指令後面可以跟着要設定的 shell 屬性選項。如果選項以 - 開頭,則是設定為打開該選項。

如果選項以 + 開頭,則是設定為關閉該選項。

使用 set -e 選項在遇到報錯後停止執行

檢視 help set 指令,對 -e 選項說明如下:

-e

Exit immediately if a command exits with a non-zero status.

即,set -e 會在遇到任何非 0 的指令傳回值時,退出所在的 shell。

在腳本開頭 #!/bin/bash 語句的下一行添加 set -e 語句,那麼執行該腳本時,執行過程中遇到的任何錯誤都會終止腳本,可以避免執行後續的腳本語句。

具體舉例說明如下:

#!/bin/bash

set -e

從程式設計的角度來說,set -e 選項的作用跟C語言的 assert() 函數類似,遇到錯誤就停止。在調試 shell 腳本時,如果遇到某個不預期的錯誤,就可以使用這個選項讓腳本及時停止運作,以便找到最接近出錯位置的語句。

使用 set -x 選項打開調試開關

檢視 help set 指令,對 -x 選項說明如下:

-x

Print commands and their arguments as they are executed.

即,set -x 會列印具體執行的指令、以及指令的參數。

這些參數是經過 bash 擴充後的參數,可以友善看到的各個變量值擴充後的結果是什麼、某個變量是否擴充為空導緻參數個數變化,等等。

如前面說明,把選項開頭的 - 改成 + 會關閉選項,set +x 指令關閉調試開關。

具體舉例如下:

$ set -x

$ ls test*

+ ls --color=auto testcase.sh testfile

$ set +x

這裡先執行 set -x 指令打開調試開關。

然後執行 ls test* 指令,可以看到擴充後的指令為 ls --color=auto testfile testcase.sh。

從擴充後的結果可以看到 test* 被擴充為目前目錄下以 "test" 開頭的檔案名,有助于了解 * 通配符的擴充結果。

可以使用類似于下面的語句在 shell 腳本中設定該選項:

#!/bin/bash

set -x

在學習 bash 通配符、各個擴充表達式時,set -x 可以列印出具體的擴充結果,便于了解。

使用 set -v 回顯所輸入的指令

檢視 help set 指令,對 -v 選項說明如下:

-v

Print shell input lines as they are read.

即,set -v 選項會回顯所輸入的指令。

跟 set -x 的差別在于,set -x 顯示的是擴充後的結果,而 set -v 顯示的是所輸入的指令自身。

具體舉例如下:

$ set -v

$ ls test*

ls test*

testcase.sh testfile

可以看到,設定 set -v 選項後,執行 ls test* 指令,回顯的内容就是 "ls test*"。

而不是回顯 test* 擴充之後、以 "test" 開頭的檔案名。