Bash:如何在 Shift 時使用;做..案例 1 美元

Bash:如何在 Shift 時使用;做..案例 1 美元

我正在編寫 bash 腳本,我需要實現“選項”。我怎麼才能用 bash 做到這一點?

我的目標是按以下方式運行腳本: /myscript.sh -d "/var/log/" -c "test"

我試過的:

while shift; do
        case $1 in
                -d)
                        shift&&DIR="$1"||die
                ;;
                -c)
                        shift&&COMMAND="$1"||die
                ;;
        esac
done

echo "$DIR"
echo "$COMMAND"

答案1

為了擴展@choroba的答案,這裡有一個如何使用的範例getopts

# parse the flag options (and their arguments)
while getopts c:d: OPT; do
    case "$OPT" in
      d)
        DIR="$OPTARG" ;;
      c)
        COMMAND="$OPTARG" ;;
      [?])
        # got invalid option
        echo "Usage: $0 [-d directory] [-c command]" >&2
        exit 1 ;;
    esac
done

# get rid of the just-finished flag arguments
shift $(($OPTIND-1))

請注意,在關閉標誌參數後,任何“常規”參數都將保留。因此,此時您可以處理它們(例如... for arg in "$@"; do ...),或者如果您的腳本不接受它們,那麼如果您遇到任何問題,請抱怨一下(if [ $# -gt 0 ]; then echo "Usage ...)。

答案2

你的錯誤是你在循環的頂部移動,在檢查第一個參數之前就扔掉了它。我想這就是你的意思:

#!/bin/bash
while (( "$#" )); do
   case $1 in
      -d)
         shift&&DIR="$1"||die
         ;;
      -c)
         shift&&COMMAND="$1"||die
         ;;
   esac
   shift
done

echo "$DIR"
echo "$COMMAND"

答案3

正如喬羅巴已經說過的那樣,獲取選擇是一個更好的方法。

對於您的情況,您可以使用:

getopts c:d: d || die
DIR=$OPTARG
getopts c:d: c || die
COMMAND=$OPTARG

來實現你想要用 while 迴圈做的事情。

該字串c:d:指定可能的開關。冒號表示開關需要參數。

您的方法的問題在於您shift在分析第一個參數之前調用,並在此過程中丟棄它。

若要解決此問題,請將 while 迴圈變更為以下內容:

while true; do
        case $1 in
                -d)
                        shift&&DIR="$1"||die
                ;;
                -c)
                        shift&&COMMAND="$1"||die
                ;;
        esac
        shift || break
done

答案4

通常的方法是使用getopts.

相關內容