9

私は bash スクリプトを使用して.jar、明示的なパスを常に入力することなく、任意の場所からファイルを呼び出して実行しています。

には.jar、実行時に追加の変数パラメータを指定する必要があります。これらは何でもよいため、スクリプトにハード コードすることはできません。

全部で 3 つの変数があります。1 つ目は が実行する 2 つのアクションのうちの 1つを.jar指定し、2 つ目はこのアクションを実行するターゲット ファイルを指定し、3 つ目はアクションが作成するファイルの名前を指定します。

私が現在使用しているスクリプトは次のとおりです。

#!/bin/bash  
java -jar "C:\path\to\file.jar" "$1" "$2" "$3"

私は bash スクリプトについてほとんど知りませんが、自分の問題 (現在は修正済み) に対する別の答えを探しているときに、コマンド ライン引数を参照するときに遭遇"$@"しました。"$*"さらに検索を行うと、次のサイトにたどり着きました: How To Wiki: How to read command line arguments in a bash script、しかし、上記の高度な bash プログラミングのトンを通り抜ける必要なしに、これらの引数に関する確実な情報を見つけることができません私の頭。

さて、私は永遠にぶらぶらしてきましたが、私の質問は比較的単純です。

またはに置き換えることはでき"$1" "$2" "$3"ますか?"$@""$*"

また、もしあれば、これらのコマンドの違いは何ですか?

4

3 に答える 3

11

"$@""$1" "$2" "$3"などに対応"$*""$1 $2 $3"ます 必要がないと思われるものに対応します。

引用符がなければ、違いはありません。どちらも対応してい$1 $2 $3ます。

于 2013-05-20T12:28:40.953 に答える
4

$*単一の単語としての$@すべてのパラメータ、個々の引用符で囲まれた文字列としてのすべてのパラメータです。

私は通常 を使用すること"$@"になりますが、私にとっては最適に機能するようです。

于 2013-05-20T12:33:21.530 に答える
0

$*の最初の文字で区切られたすべての引数で構成される単一の文字列が含まれます$IFS。したがって、IFS引数に実際には存在できない文字 (たとえば、ファイル名を渡す場合の改行) を含めるように設定した場合、 と は機能的に同等であると見なすことができますが$*"$@"内部では動作が異なります。

$@基本的に、すべての引数の配列です。二重引用符 ( ) で渡される"$@"と、シェルは配列内の各値を二重引用符で個別にラップします (変数の展開全体を二重引用符で囲むという通常の規則の奇妙な例外になります)。

IIRC、$@二重引用符のない裸の動作は POSIX 仕様で完全に指定されていないため、未定義の動作と見なす必要があります。$@したがって、二重引用符なしで裸を使用しないでください。

ところで、バージョン 3 より前の System V に関心がある場合は、システム Vの処理方法にいくつかの古い癖$@.がありました。 これらは、現時点では主に歴史的に興味深いものですが、人々が問題に遭遇したときに標準がどのように進化したかについての理解を深めることができます。 . :-)

于 2018-01-08T19:09:36.037 に答える