たとえば、gcc は、フラグのない入力ファイルと次のフラグを持つ-o
出力ファイルを受け入れます。
gcc input.c -o output.out
または
gcc -o output.out input.c
-s
ユーザーがそれぞれ、-l
およびフラグを使用して-u
特殊文字、小文字、および大文字の数を指定できるランダムパスワードジェネレータbashスクリプトを作成しています。また、フラグなしでパスワードの長さを指定できる必要があります。
使用例:
./randompassword.sh -s2 -u2 -l3 16
特殊文字2個、大文字2個、小文字3個を含み、長さ16のパスワードを示す必要があります。
getopts
次のようにフラグを解析できます。
while getopts s:l:u: flag
do
case "${flag}" in
s) special=${OPTARG};;
l) lower=${OPTARG};;
u) upper=${OPTARG};;
esac
done
しかし、フラグなしで長さパラメータを取得する方法がわかりません。
を試しましたが、$1
このパラメータはgccの例のようにコマンドのどこにでも配置できるはずです。
答え1
getopts
オプションではなく引数に達すると、引数リストの解析を停止します。つまり、オプション引数を左から右に繰り返すと成功を返し、オプションではなく最初の引数は失敗を返します。したがって、正しいユースケースはですput options and their arguments on the command line before any non-option arguments
。
getops
これでチュートリアルにコマンドが表示されますshift $((OPTIND - 1))
。ループwhile
はオプションパラメータを繰り返し、shift
位置変数からそれを削除し、オプションではなくパラメータ(存在する場合)を$@
。
コードでチュートリアルの変数を使用します。
while getopts ':s:l:u:' OPTION
do
case "${OPTION}" in
s) special=${OPTARG};;
l) lower=${OPTARG};;
u) upper=${OPTARG};;
\?) echo "$0: Error: Invalid option: -${OPTARG}" >&2; exit 1;;
:) echo "$0: Error: option -${OPTARG} requires an argument" >&2; exit 1;;
esac
done
shift $((OPTIND - 1))
# now the positional variables have the non-option arguments
echo "${1}"
例コマンド(./randompassword.sh -s2 -u2 -l3 16
)の場合、出力はです16
。
:
getopts文字列に先頭を追加した理由は、「自動エラー報告」を提供するためです。これにより、スクリプトはエラーをキャッチし、より使い慣れた苦情を発行することができます。これが私が声明に追加した2つの追加オプションがすることですcase
。
ユーザーがルールに違反してオプションパラメータを入力した場合後ろにオプション以外のパラメータ、後続のオプションパラメータは上記のループwhile
では解析されません。$@
残りの位置パラメータを含む配列に表示されます。ユーザーが指示に従ってオプションではない引数の前にすべてのオプション引数を入力すると、$@
ループとコマンドの完了後に配列にオプションではない引数が含まれます。while
shift
オプションでない引数が入力される順序に関する懸念に応じて、スクリプトにはユーザーが従う必要がある厳密な順序が必要であるか(そうでない場合はエラーが発生する)、スクリプトに特定の順序を必要とせずにユーザーが従う必要があります。別の解析方法を使用して使用方法を学びます。
しかし、私の考えには、順序付けされていないパラメータのためにオプション文字があるようです。残りの引数は順序付けされています。それ以外の場合は、オプション文字が表示されます。しかし、これは私の意見だけです。