1. 程式人生 > 實用技巧 >Shell指令碼中的set指令,比如set -x 和 set -e

Shell指令碼中的set指令,比如set -x 和 set -e

set引數介紹

set指令能設定所使用shell的執行方式,可依照不同的需求來做設定
 -a  標示已修改的變數,以供輸出至環境變數。
 -b  使被中止的後臺程式立刻回報執行狀態。
 -C  轉向所產生的檔案無法覆蓋已存在的檔案。
 -d  Shell預設會用雜湊表記憶使用過的指令,以加速指令的執行。使用-d引數可取消。
 -e  若指令傳回值不等於0,則立即退出shell。  
 -f   取消使用萬用字元。
 -h  自動記錄函式的所在位置。
 -H Shell  可利用"!"加<指令編號>的方式來執行history中記錄的指令。
 -k  指令所給的引數都會被視為此指令的環境變數。
 -l  記錄for迴圈的變數名稱。

 -m  使用監視模式。
 -n  只讀取指令,而不實際執行。
 -p  啟動優先順序模式。
 -P  啟動-P引數後,執行指令時,會以實際的檔案或目錄來取代符號連線。
 -t  執行完隨後的指令,即退出shell。
 -u  當執行時使用到未定義過的變數,則顯示錯誤資訊。
 -v  顯示shell所讀取的輸入值。
 -x  執行指令後,會先顯示該指令及所下的引數。
 +<引數>  取消某個set曾啟動的引數。

set -x介紹

用於指令碼除錯,在liunx指令碼中可用set -x就可有詳細的日誌輸出.免的老是要echo了

set -e介紹

#!/bin/bash
set -e
command 1
command 2 ... exit 0

你寫的每個指令碼都應該在檔案開頭加上set -e,這句語句告訴bash如果任何語句的執行結果不是true則應該退出。這樣的好處是防止錯誤像滾雪球般變大導致一個致命的錯誤,而這些錯誤本應該在之前就被處理掉。如果要增加可讀性,可以使用set -o errexit,它的作用與set -e相同。

使用-e幫助你檢查錯誤。如果你忘記檢查(執行語句的結果),bash會幫你執行。不幸的是,你將無法檢查$?,因為如果執行的語句不是返回0,bash將無法執行到檢查的程式碼。你可以使用其他的結構:

command  
if [ "$?"-ne 0]; then   
    echo 
"command failed"; exit 1; fi could be replaced with 能夠被代替為 command || { echo "command failed"; exit 1; } 或者 if ! command; then echo "command failed"; exit 1; fi

如果你有一個命令返回非0或者你對語句執行的結果不關心,那你可以使用command || true,或者你有一段很長的程式碼,你可以關閉錯誤檢查(不使用set -e),但是我還是建議你保守地使用這個語句。