Bashでコマンドライン引数を変更するにはどうすればよいですか?


92

Bashスクリプトのコマンドライン引数を変更する方法はありますか?たとえば、Bashスクリプトが次のように呼び出されたとします。

./foo arg1 arg2  

スクリプト内でarg1の値を変更する方法はありますか?言います

$1="chintz"

回答:


147

すべての引数をリセットする必要があります。例を変更するには$3

$ set -- "${@:1:2}" "new" "${@:4}"

基本的に、変更する引数を除いて、すべての引数を現在の値に設定 ます。POSIX 7set --でも指定されています。

"${@:1:2}"表記は、2つ(それゆえに拡張され2たオフセットから開始表記)位置引数1(すなわち$1)。これは"$1" "$2"この場合の省略形ですが、たとえばを置き換える場合ははるかに便利です"${17}"


1
つまり、$ 3を変更するには、$ 1と$ 2も変更する必要がありますか。そして、それらを何に変更しますか?「リセット」とはどういう意味ですか?
スリラム

トリックをありがとう!スペースが埋め込まれたファイル名にこれを使用するのは困難でした。その問題に遭遇する可能性のある他の誰にとっても、このevalあたりの最前線に置いてみてください。
cxw 2013年

2
これは、変更するパラメーターの位置がわかっている場合は問題ありません。実際にそれを知らず、動的に変更する必要がある場合はどうなりますか?$ set-"$ {:1:$ pivot}"で試してみましたが、そこで変数を受け入れません。
Daniele Segato、2014年

1
関数内から同じことをするにはどうすればよいですか?関数の内部から呼び出されたときに、ソリューションが機能しないようです。
Hashken

2
関数内からスクリプトの定位置パラメーターを変更することはできません-関数自体の引数はそれらを非表示にします。ただし、配列に格納して操作することはできます。
thkala

22

読みやすさと保守性を最適化するには、より意味のある変数(わからない、または何か)を割り当て$1$2から、それらの変数の1つを上書きし()、スクリプトへの入力を変更しないでおくinput_filename = $1output_filename = $2よいでしょう。input_filename = 'chintz'他の場所で必要。


入力引数自体の1つを変更できるアプローチが必要でした。スクリプトから値を返したいので、これを行う必要がありました。thkalaによって提案された答えはうまくいきました。ご返信ありがとうございます!!!
スリラム

3
@Johnsyweb同意した。読みやすくするために、あなたの方法がより良い方法です。
Dss 2014年

1
「あなたのほうがいい」は常にユースケースに依存しますが、これは提供されていません。
スコット

2
@Scottは、この回答を書いたときよりも7歳年上で、私よりも多くの経験があるので、あなたに同意する傾向があります。
Johnsyweb 2018

これが機能しない例($ FIRST_PARAMETERなどの使用を除いて):実際の値に応じてパラメーターの使用と意味を持ちます。
Igor Stoppa 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.