shell 腳本的「dash」參數

shell 腳本的「dash」參數

我使用的大多數 shell 腳本的語法如下

./shellscript.sh -first_argument_flag <first_argument_value> -second_argument_flag <second_argument_value>

但是 shell 腳本編寫者的所有線上資源都只討論傳遞位置參數,例如

./shellscript.sh <first_argument_value> <second_argument_value> 

隨後在腳本中使用"$1""$2"等。

我想使用第一個更用戶友好的語法,而不是位置參數語法。例如,假設我想回顯帶有標誌 -f 的檔案名稱和帶有標誌 -d 的目錄。將此腳本命名為 echofd.sh。我想

./echofd.sh -f myfile.txt -d /my/directory/ 

產生輸出

您的檔案是:myfile.txt

您的目錄是:/我的/目錄/

並且無論 -f 和 -d 在呼叫腳本時的順序如何。

答案1

有的是getopts標準(內建)實用程式在 POSIX shell 中用於解析命令列參數。

您可以使用此範本:

#! /bin/sh -
PROGNAME=$0

usage() {
  cat << EOF >&2
Usage: $PROGNAME [-v] [-d <dir>] [-f <file>]

-f <file>: ...
 -d <dir>: ...
       -v: ...
EOF
  exit 1
}

dir=default_dir file=default_file verbose_level=0
while getopts d:f:v o; do
  case $o in
    (f) file=$OPTARG;;
    (d) dir=$OPTARG;;
    (v) verbose_level=$((verbose_level + 1));;
    (*) usage
  esac
done
shift "$((OPTIND - 1))"

echo Remaining arguments: "$@"

就像其他標準命令一樣,它以標準方式解析參數。例如,您可以將其稱為:

myscript -vvv -f file -d dir other arg
myscript -ffile -ddir -- other arg

POSIX 規範或您的 shell 手冊以了解詳細資訊。

答案2

#!/bin/bash
myfile=''
mydir=''

parse_args() {
    case "$1" in
        -d)
            mydir="$2"
            ;;
        -f)
            myfile="$2"
            ;;
        *)
            echo "Unknown or badly placed parameter '$1'." 1>&2
            exit 1
            ;;
    esac
}

while [[ "$#" -ge 2 ]]; do
    parse_args "$1" "$2"
    shift; shift
done

相關內容