回答:
このことを行う別の方法は、宣言するパラメーターに名前を付けて、それを行うことです。
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
上記の例では、明示的に宣言された環境変数がコマンドライン引数よりも優先されますが、環境変数が空または未設定の場合はコマンドライン引数が使用されます。8番目の定位置変数と環境変数の$eight両方が空または未設定の場合、デフォルト値some_defaultが割り当てられ$eightます。どちらの場合でも、空が許容値である場合:は、:-or :=ステートメントから削除できます。
変数$eightは次のように設定することもできます。
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
...と前の行は完全に省略されましたが、そのように変数を宣言すると永続的な値になることを実証したかったので、2つのコマンドでそれを行いました。いずれの方法$eightも、その複合パラメーター展開の最終値に設定されます。
getopts-堅牢なスクリプトの場合-多くの場合、コマンドオプションを処理する最適な方法です。一方、位置パラメータは、ほとんどの場合、スクリプト内のオペランドを堅牢に処理する最も簡単な手段です。
例えば:
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
そこには8番目のオペランドしかありませんが、テストディレクトリから101個がグロブされています。
スクリプトを変更できると仮定すると、必須パラメーター(引数)ではなくオプションのパラメーター(オプション)の使用を検討する必要があります。
最初の7つの7つのパラメーターのそれぞれをオプションとして使用し、デフォルトで空の文字列にする場合は、次のようにします。
./foo bar
あなたが使用している場合は、POSIX互換のシェルを、あなたは使用することができgetopts、ユーティリティ、またはプログラムをgetopt。bash-ほとんどのシェルのように- getoptsビルトインとして提供しています。どちらの方法も、独自のコマンドラインパーサーを展開するよりも簡単です。
最後のXの非オプション引数が最後のY引数とXYオプション引数の値である場合を除き、これらのいずれかを設定する場合は、7つの(現在は空の)文字列のそれぞれの前にオプション文字列を指定する必要があります。ただし、これは一般的な方法ではありません。通常、オプションは常にオプションであり、引数は引数であり、オプション「挿入」の順序は自由です。
+1のためにgetopt(s)。位置パラメータは悲しい時間であり、避けるべきです。