私はこれを使用しています:
例えば./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 -f
NOK: - で始まる文字列がフラグとして検出されないのはなぜですか?
答え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
。
コマンドラインオプションはすべての引数を受け入れたり、引数を受け入れたりすることはできません。