getoptsを使用してシェルスクリプトフラグとパラメータを正しく解析する方法

getoptsを使用してシェルスクリプトフラグとパラメータを正しく解析する方法

私はこれを使用しています:

例えば./imgSorter.sh -d directory -f format

スクリプトの内容は次のとおりです。

#!/bin/bash
while getopts ":d:f:" opt; do
  case $opt in
    d)
      echo "-d was triggered with $OPTARG" >&2
      ;;
    f)
      echo "-f was triggered with $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

例:

$ ./imgSorter.sh -d myDir -d was triggered with myDirいいね

$ ./imgSorter.sh -d -f myFormat -d was triggered with -fNOK: - で始まる文字列がフラグとして検出されないのはなぜですか?

答え1

getoptsオプション-dが引数を受け入れなければならないと言いましたが、コマンドラインでそれを使用している場合、「はオプションに指定した引数です」-d -f myformatと明確に(?)言います。-f-d

これはコードのバグではなく、コマンドラインでスクリプトを使用するバグです。

コードでは、オプションパラメータが正しいこと、およびすべてのオプションが適切な方法で設定されていることを確認する必要があります。

これもできます

while getopts "d:f:" opt; do
  case $opt in
    d) dir=$OPTARG      ;;
    f) format=$OPTARG   ;;
    *) echo 'error' >&2
       exit 1
  esac
done

# If -d is *required*
if [ ! -d "$dir" ]; then
    echo 'Option -d missing or designates non-directory' >&2
    exit 1
fi

# If -d is *optional*
if [ -n "$dir" ] && [ ! -d "$dir" ]; then
    echo 'Option -d designates non-directory' >&2
    exit 1
fi

この-dオプションがオプションであり、使用する場合基本dir上記のコードの変数値に対してループを実行するdir前に、まずそのデフォルト値に設定できますwhile

コマンドラインオプションはすべての引数を受け入れたり、引数を受け入れたりすることはできません。

関連情報