[英]Shell script not running on Mac OS
我有一個非常簡單的 bash 腳本來執行部署。 這是我的代碼:
#!/usr/bin/env bash
function print_help
{
echo '
Deploy the application.
Usage:
-r reinstall
-h show help
'
}
reinstall=false
while getopts "rh" opt; do
case ${opt} in
r)
echo "clean"
reinstall=true
;;
h)
echo "help"
print_help
exit 0
;;
esac
done
我調用腳本如下:
. deploy.sh -h
無論我做什么,這兩個選項(即-r,-h)都不會導致相應的echo
,並且在-h
的情況下,不會調用print_help
function。
做錯了什么?
getopts
使用全局變量OPTIND
來跟蹤它當前處理的參數。 它解析的每個選項,它遞增/更改OPTIND
以跟蹤哪個參數將是下一個。
如果您在不更改OPTIND
的情況下調用getopt
,它將從上次結束的位置開始。 如果它已經解析了第一個參數,它會希望從第二個參數繼續解析,等等。因為在第二次(或以后)你獲取腳本時沒有第二個參數,所以只有-h
, getopt
將失敗,因為它認為它已經解析了-h
。
如果要重新解析當前 shell 中的 arguments,只需重置 OPTIND OPTIND=1
即可。 或者啟動一個全新的 shell,它會自行將OPTIND
重置為1
。
如果點和腳本名稱之間有空格,那么您不會啟動腳本,而只是將其采購到您當前的 shell session !
如果你想運行你的 scipt 你應該這樣做:
# chmod +x ./deploy.sh
# ./deploy.sh -h
如果您獲取它,您的 scipt 中的函數和變量將在您當前的 shell session 中可用,這可以讓您執行以下操作:
# . ./deploy.sh
# print_help
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.