shell脚本命令set
文章目錄
- 1. 簡介
- 2. set -e
- 3. set -o pipefail
- 4. set -u
- 5. set -x
- 6. 總結
1. 簡介
在寫shell的時候我們經常面臨的問題一般都是:
這里會介紹shell腳本中的一個非常有用的命令,上面的錯誤可以通過這個命令來避免,腳本的調試也會變得非常容易,這個牛叉的命令就是set命令。
set 命令在沒有參數的時候會顯示當前環境的所有環境變量,比如直接執行 set看一看到一大堆東西
set帶參數的命令可以用來設置shell的變量,他的功能還挺多的,今天我們主要學習的是和shell腳本的運行模式有關的命令,主要的命令有以下幾個。
set -e set +eset -u set +uset -x set +xset -o pipefail set +o pipefail可以看到上面的命令基本都是成對出現的,一個是減號,一個是加號,我們可以理解為set命令是對shell的工作模式進行了設置
減號-是開啟了某種模式,加號 +則是關閉對應的模式。后面我們會詳細介紹。
2. set -e
set -e的功能是遇到錯誤后腳本會直接退出,不會繼續往下執行
我們先準備一個腳本 test.sh
執行bash test.sh
cat: 123: No such file or directory test.sh: line 5: necho: command not found 123因為不存在名子為123的文件,所以cat命令執行報錯,同樣的,因為不存在necho命令,所以也會報錯,關鍵是報錯后都會繼續向下執行,所以
echo $aa還是會成功輸出123, 但是很多時候我們希望在執行錯誤后能夠立即退出,而不是繼續向下執行,那么可以在代碼前加一個set -e
$ cat test.sh#!/bin/bashset -e aa=123 cat $aa necho $aa echo $aa$ bash test.sh
cat: 123: No such file or directory這樣就ok了,遇到錯誤后腳本會直接退出,不會繼續往下執行。
如果你只是想對其中的一段代碼做這種的設置,那么你可以這樣做
執行
$ bash test.sh cat: 123: No such file or directory 123 test.sh: line 8: necho: command not found 123對于上面的文件set的作用域只是在第5-7行,因為第6行可以正確執行,所以整個腳本也就可以正確執行了。
這種局部開啟的方式很多時候沒有必要,盡量在文件頭部加一個就好了,當然在有些時候還是很有必要的,比如你要判斷某個子shell的執行結果,使用了$?變量,那么就要關閉set了。
3. set -o pipefail
set -o pipefail這個命令主要是對上面的set -e的補充,因為set -e對于管道符是無效的,比如上面的腳本假如變成
$ cat -n test.sh1 #!/bin/bash23 set -e4 aa=1235 cat $aa | echo6 echo $aa78執行
$ bash test.shcat: 123: No such file or directory 123可以看到使用管道符號|的話set -e也不好用了,這個時候假如使用 set -o pipefail則可以解決這個問題
$ cat -n test.sh1 #!/bin/bash23 set -e4 set -o pipefail56 aa=1237 cat $aa | echo8 echo $aa910執行
$ bash test.shcat: 123: No such file or directory可以看到cat失敗后后面的不會再執行了。
4. set -u
執行腳本的時候,如果遇到不存在的變量,Bash 默認忽略它,set -u可以在需要的變量不存在的時候直接報錯退出
cat -n test.sh1 #!/bin/bash23 aa=1234 echo $bb5 echo $aa執行
$ bash test.sh123可以看到,即使變量 bb不存在也不會報錯,如果想要避免這種情況,可以這樣做
$ cat -n test.sh1 #!/bin/bash23 set -u4 aa=1235 echo $bb6 echo $aa執行
$ bash test.sh test.sh: line 5: bb: unbound variable同樣的,你也可以通過
set +u關閉這個模式設置
5. set -x
??有些時候我們寫的腳本比價長也比較復雜,引起最終結果出錯的原因可能是前面多個步驟運算出錯導致的(程序沒有語法錯誤,可能是賦值計算等出錯)
??這個時候如果通過echo的方式去調試每一步的值會非常麻煩,而且后面還要注釋掉大量的echo語句。這個時候就可以通過set -x來打開調試,讓調試變得十分簡單。
執行
$ bash test.sh + k=10.76.0.27aaa + set +x 10.76.0.27aaa要是能夠顯示哪一行執行的結果就更好了,別怕,可以這樣設置
$ cat -n test.sh1 #!/bin/bash23 export PS4='+{$LINENO:${FUNCNAME[0]}} '45 ip=`ifconfig eth0| awk 'NR==2{print $0}'|awk -F "[:]" '{print $2}'|awk '{print $1}'`6 set -x7 k=$ip"aaa"8 set +x9 echo "$k"1011再執行
$ bash test.sh +{7:} k=10.76.0.27aaa +{8:} set +x 10.76.0.27aaa可以看到行號也顯示出來了,其實冒號后面是要顯示方法名的,因為這里沒有使用方法,所以沒有顯示。下面給一個方法使用的樣例。
$ cat -n test.sh1 #!/bin/bash23 export PS4='+{$LINENO:${FUNCNAME[0]}} '456 function tool()7 {89 ip=`ifconfig eth0| awk 'NR==2{print $0}'|awk -F "[:]" '{print $2}'|awk '{print $1}'`10 set -x11 k=$ip"aaa"12 set +x13 echo "$k"1415 }1617 tool18執行
$ bash test.sh +{11:tool} k=10.76.0.27aaa +{12:tool} set +x 10.76.0.27aaa6. 總結
??通過上面的樣例學習,可以了解到使用set命令可以使我們的shell變得更加安全,可預期。同時別忘了,set +是可以關閉對應的模式的,這個在有些時候也是有必要的。
??對于初開始寫shell腳本的同學可以養成使用這個命令的習慣,會大大提升shell編寫的安全感。
建議
都直接開啟
對于復雜的腳本可以局部開啟
總結
以上是生活随笔為你收集整理的shell脚本命令set的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spark的内存过小报错
- 下一篇: spark-on-yarn日志配置