2017-10-16 62 views
-2

問題:
如果我的程序選擇'-v',它應該打印「再見!」在節目結束時。我可以做到這一點,但它會在開始時打印它。所以我需要一些命令來執行它,如果有的話。或者我該怎麼做?Bash。 getopts命令。選項,將在程序結束時執行某些操作

getopts "v" opt 
case ${opt} in 
v) echo "Good bye!" 
esac 
+0

什麼是「smth」? – maffo

+0

@poixen:可能是「something」的縮寫。我會編輯。 –

回答

1

你只設置一個變量,在分析選項,並在腳本的末尾,基於變量的值,你會如果執行所需的操作

say_bye=false 
while getopts "v" opt; do 
    case "$opt" in 
    v) say_bye=true ;; 
    esac 
done 

# do stuff 

# and at the end: 
$say_bye && echo "Good bye!" 

您腳本有多個潛在的終點,你想說再見所有的人,請使用EXIT陷阱

say_bye=false 
while getopts "v" opt; do 
    case "$opt" in 
    v) say_bye=true ;; 
    esac 
done 

end_business() { 
    $say_bye && echo byebye 
} 
trap end_business EXIT 

# do the rest of your script here ... 
+0

這看起來**非常危險**!隨機執行一個變量的內容,只是爲了測試變量是否被設置。 – randomir

+1

@randomir:沒有什麼是隨機的,它可以自己控制變量的值。如果它唯一可能的值是'false'和'true',則執行它是安全的。 –

+0

對於稍後閱讀代碼的人來說,這是非常脆弱和不直觀的。爲什麼不'say_bye = 0' /'say_bye = 1'然後'((say_bye))&& action'? – randomir

0

假設你-v意爲「冗長」,我喜歡set -x在許多腳本中獲取調試輸出。如果你這樣做,你可以用無操作語句這樣,充當讀者時不詳細評論辣椒腳本,但輸出到標準錯誤時冗長是 -

: setting x to "$x" 

這很好地與吻合在EXIT上陷阱,正如@glenn已經提到的那樣。因此,

while getopts "v" opt 
do case "$opt" in 
    v) verbose=1 # in case you need other contingent code bits 
     set -v ;; 
    esac 
done 

然後

trap ' : "bye-bye!" ' EXIT 

這將無害執行和輸出咱這set -x關閉。

相關問題