我有一個bash腳本需要一個可選參數,如下所示,我想對其進行優化,以便我可以用不同方式傳遞第一個參數(0,false表示)一個錯誤的值,所有其他的字符串來表示真,默認爲假),這是一個優雅的方式來編寫腳本?我想用正確的布爾表達式來使用if語句。處理可選參數的bash腳本
if [ -n "$1" ]; then update_httpconf="$1"; fi if [ "$update_httpconf" = "true" ]; then echo "hi"; fi
我有一個bash腳本需要一個可選參數,如下所示,我想對其進行優化,以便我可以用不同方式傳遞第一個參數(0,false表示)一個錯誤的值,所有其他的字符串來表示真,默認爲假),這是一個優雅的方式來編寫腳本?我想用正確的布爾表達式來使用if語句。處理可選參數的bash腳本
if [ -n "$1" ]; then update_httpconf="$1"; fi if [ "$update_httpconf" = "true" ]; then echo "hi"; fi
如果你成功了,這樣做的第一個參數--update-httpconf
算作是真實的,什麼都算作是假的,這將是與其他unixey命令更加一致線公用事業。
這可能是一個很好的起點:
while [ $# -gt 0 ]
do
case $1 in
'--update-httpconf')
update_httpconf=true
;;
*)
echo "unrecognised arg $1"; exit
;;
esac
shift
done
使用case
聲明:
case "$1" in
0|false|FALSE) do_something;;
*) do_something_else;;
esac
我真的不能明白是怎麼回事。有人會關心解釋嗎? – TomCho
它正在遍歷命令行參數。「$#」會計算剩餘命令行參數的數量;在循環結束時,我調用'shift',它拋棄列表前面的參數。在每個循環中,我們都匹配'$ 1',它是列表前面的命令行參數。如果'$ 1'是'--update-httpconf',那麼我們將變量'update_httpconf'設置爲'true'。 '*'模式對case語句來說是一個全面的方式,所以如果我們到達它,那就意味着遇到了一個無法識別的參數,所以我們可能會失敗並退出程序。 – hdgarrood
好的一段代碼。非常感謝你的解釋。 – TomCho