Bashで変数を別のプログラム($ *または$ @)に渡す最も安全な方法は何ですか? [コピー]

Bashで変数を別のプログラム($ *または$ @)に渡す最も安全な方法は何ですか? [コピー]

誰かがこれら2つの変数の違いを簡潔に説明できますか?

変数を他のプログラムに渡す最も安全な方法は何ですか?

例えば

#! /bin/bash

# do stuff

# pass variables onto another program
java $@

答え1

次のスクリプトを使用してください。

#! /bin/sh
# Greg Wooledge's args script
printf "%d args:" $#
printf " <%s>" "$@"
echo

このデモを試してください。

$ set -- a 'b     c' d
$ args $*
4 args: <a> <b> <c> <d>
$ args $@
4 args: <a> <b> <c> <d>
$ args "$*"
1 args: <a b     c d>
$ args "$@"
3 args: <a> <b     c> <d>

通常(引用符を含む)を使用する必要があります"$@"

時には、IFS以下を変更して使用するのが便利です"$*"

$ saveIFS=$IFS; IFS='|'; args "$*"; IFS=$saveIFS
1 args: <a|b     c|d>

答え2

"$@"拡張なしでarglistを渡し、各引数を分離するので、最も安全です。バラよりhttp://www.faqs.org/docs/abs/HTML/variables2.html#ARGLISTもっと学ぶ。

答え3

用途:"$@"元のパラメータ(パラメータなしを含む)を正確に表現したい場合。

言及できる5つの記号があります。

  • $@
  • $*
  • "$@"
  • "$*"
  • ${1+"$@"}

最初の2つは同じです。どちらも、引数リストの単語を分割して呼び出されるコマンドに渡します。正しい選択になることはほとんどありません。

後者の2つはまったく異なります。この"$@"表記法は、シェルの引数(またはコマンドによって設定された引数)を呼び出しコマンドに効果的にsetコピーし、引数の数、引数のスペース、および引数の間の区別を維持します。引数が0の場合、何も生成されません。

この"$*"表記法は、すべてのパラメータを単一の文字列に貼り付け、パラメータ間にスペースを配置し、パラメータ内にスペースを保持します。次のような状況での使用に適しています。

echo "You said, '$*'"

元のコマンドラインの最大忠実度は重要ではありません。

最後の記号は、${1+"$@"}以前のシェルスクリプトに触れることができる過去の記号です。昔々(昔 - 例えば30年前)、"$@"Bourneシェルはパラメータがないときに1つの空のパラメータとして扱いました。この現象は長い間表示されていませんが、以前に書かれたいくつかのスクリプトはまだこの表記法を使用して自分自身を保護できます。この${1+X}記号は、「$1空の文字列でも何でも設定されている場合は値を提供する」という意味ですX。問題の表記法では、Xisは"$@"1つ以上の引数が既知の場合の引数のリストです。それ以外の場合は引数はありません。これは"$@"現代のシェルと同じ意味を持ちます。

関連情報