1. ホーム
  2. bash

[解決済み] 私のbashスクリプトに渡されたすべての引数を、私の関数に渡すにはどうすればよいですか?[重複しています。]

2022-03-22 16:13:56

質問

を定義したとします。 function abc() は、スクリプトに渡された引数の分析に関連するロジックを処理します。

bashスクリプトが受け取ったすべての引数を渡すにはどうしたらよいですか?paramsの数は可変なので、このように渡された引数をハードコードすることはできません。

abc $1 $2 $3 $4

編集 . それよりも、私の関数がスクリプトの引数の変数にアクセスできるようにする方法はないでしょうか?

解決方法は?

その $@ 変数は、スペースで区切られたすべてのコマンドラインパラメータに展開されます。 以下はその例である。

abc "$@"

を使用する場合 $@ は、スペースやワイルドカードを含む引数の誤読を避けるため、 (ほとんど) 常に二重引用符で囲む必要があります (以下を参照)。 これは複数の引数に対して有効である。また、これはすべてのPOSIX準拠のシェルに移植可能である。

また、特筆すべきは $0 (一般にスクリプトの名前やパス)は $@ .

Bash リファレンスマニュアル 特殊パラメータ編 には、次のように書かれています。 $@ は、1から始まる位置指定パラメータに展開されます。 二重引用符の中で展開される場合、各パラメータは別々の単語に展開されます。 つまり "$@" は次のように等価です。 "$1" "$2" "$3"... .

通過する 一部 引数を指定します。

を渡したい場合は を除くすべての 引数を指定する場合は、まず shift を渡して、最初の引数を消費させ、その後に "$@" を使えば、残りの引数を別のコマンドに渡すことができます。 bashでは(zshやkshもそうですが、dashのような普通のPOSIXシェルでは)、配列スライスの変種を使って、引数リストをいじらずにこれを行うことができます。 "${@:3}" で始まる引数を取得します。 "$3" . "${@:3:4}" で始まる4つの引数まで取得できます。 "$3" (例) "$3" "$4" "$5" "$6" )、それだけの引数が渡された場合。

おそらくやりたくないこと。

"$*" は、すべての引数を一つの文字列にまとめてしまいます(スペースで区切るか、あるいは $IFS です)。このため、スペース 引数とスペース の間に の引数であるため、一般に良くないとされています。しかし、例えば、引数を印刷するためには大丈夫かもしれません。 echo "$*" ただし、区別のためのスペースが必要でない場合は、この限りではありません。

引数を通常の変数に代入する(例えば args="$@" のように、すべての引数をひとまとめにします。 "$*" が行います。引数を変数に格納したい場合は、配列を使用して args=("$@") (括弧で囲むと配列になります)そして、それらを例えば "${args[0]}" など。なお、bashやkshでは、配列のインデックスは0から始まるので $1args[0] 一方、zshは配列のインデックスを1から始めるので $1args[1] . また、dashのようなもっと基本的なシェルでは、配列は全くありません。

ダブルクオートを省略する場合は $@ または $* の場合、それぞれの引数を別々の単語に分割しようとします。 $IFS また、ファイル名のワイルドカードのように見えるものはすべて、 一致するファイル名のリストに展開しようとします。これは本当に奇妙な効果をもたらすことがあるので、ほとんど常に避けるべきです。(ただし、zsh では、デフォルトでこの展開は行われません)。