シェルスクリプトを実行する場合、特定の位置パラメーターをすべて順番に入力することなく渡すことができますか?


13

たとえば、10個のパラメーターを受け取るスクリプト./fooがあり、8番目のパラメーターのみを渡したい場合です。現在これを行う方法を知っている唯一の方法は:

./foo '' '' '' '' '' '' '' 'bar'

より簡単/より良い方法はありますか?


1
多くのパラメータがある場合、プログラムは通常、位置パラメータではなくオプションを使用するのはこのためです。
バーマー14

回答:


4

このことを行う別の方法は、宣言するパラメーターに名前を付けて、それを行うことです。

{   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個がグロブされています。


18

スクリプトを変更できると仮定すると、必須パラメーター(引数)ではなくオプションのパラメーター(オプション)の使用を検討する必要があります。

最初の7つの7つのパラメーターのそれぞれをオプションとして使用し、デフォルトで空の文字列にする場合は、次のようにします。

./foo bar

あなたが使用している場合は、POSIX互換のシェルを、あなたは使用することができgetopts、ユーティリティ、またはプログラムをgetoptbash-ほとんどのシェルのように- getoptsビルトインとして提供しています。どちらの方法も、独自のコマンドラインパーサーを展開するよりも簡単です。

最後のXの非オプション引数が最後のY引数とXYオプション引数の値である場合を除き、これらのいずれかを設定する場合は、7つの(現在は空の)文字列のそれぞれの前にオプション文字列を指定する必要があります。ただし、これは一般的な方法ではありません。通常、オプションは常にオプションであり、引数は引数であり、オプション「挿入」の順序は自由です。


5
+1のためにgetopt(s)。位置パラメータは悲しい時間であり、避けるべきです。
HalosGhost 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.