日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

shell脚本命令set

發布時間:2024/2/28 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell脚本命令set 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 簡介
    • 2. set -e
    • 3. set -o pipefail
    • 4. set -u
    • 5. set -x
    • 6. 總結

1. 簡介

在寫shell的時候我們經常面臨的問題一般都是:

  • shell遇到錯誤的時候不會停止,接著執行下面的shell命令的時候有時候是一種非預期的行為,可能會產生破壞性,所以我們寫的總是小心翼翼。
  • shell的調試比較困難,尤其是當我們在linux服務器上使用vim來進行shell的編寫的時候更會存在這種情況,只能靠不斷的加一些echo命令來嘗試看看發生了什么。
  • 這里會介紹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

    cat test.sh #!/bin/bashaa=123 cat $aa necho $aa echo $aa

    執行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了,遇到錯誤后腳本會直接退出,不會繼續往下執行。
    如果你只是想對其中的一段代碼做這種的設置,那么你可以這樣做

    $ cat -n test.sh1 #!/bin/bash23 aa=1234 cat $aa5 set -e6 echo $aa7 set +e8 necho $aa9 echo $aa

    執行

    $ 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來打開調試,讓調試變得十分簡單。

    $ cat -n test.sh1 #!/bin/bash234 ip=`ifconfig eth0| awk 'NR==2{print $0}'|awk -F "[:]" '{print $2}'|awk '{print $1}'`5 set -x6 k=$ip"aaa"7 set +x8 echo "$k"910

    執行

    $ 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.27aaa

    6. 總結

    ??通過上面的樣例學習,可以了解到使用set命令可以使我們的shell變得更加安全,可預期。同時別忘了,set +是可以關閉對應的模式的,這個在有些時候也是有必要的。
    ??對于初開始寫shell腳本的同學可以養成使用這個命令的習慣,會大大提升shell編寫的安全感。
    建議

    set -e set -u set -o pipefail

    都直接開啟
    對于復雜的腳本可以局部開啟

    set -x

    總結

    以上是生活随笔為你收集整理的shell脚本命令set的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。