簡體   English   中英

Shell 腳本未在 Mac OS 上運行

[英]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 ,它將從上次結束的位置開始。 如果它已經解析了第一個參數,它會希望從第二個參數繼續解析,等等。因為在第二次(或以后)你獲取腳本時沒有第二個參數,所以只有-hgetopt將失敗,因為它認為它已經解析了-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM