(bash)スクリプト間にスペースを入れて引数を渡す


92

私は次のbash 2つのスクリプトを持っています

灰:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

someAppバイナリは$*、1ではなく2つの引数(「My」と「Argument」)として受け取ります。

私はいくつかのことをテストしました:

  • someAppのみを実行b.shすると期待どおりに機能する
  • b.sh期待どおりに動作する引数を反復+エコー
  • $@代わりに使用$*しても違いはありません

6
試すsomeApp "$*"someApp "$@"
ラッセルUHL

1
Yupp-魅力のように動作します!
ジョンフィア

回答:


146

$*は、引用符で囲まずに2語に展開されます。someApp単一の引数を受け取るように引用符で囲む必要があります。

someApp "$*"

$@代わりに使用する可能性があるため、次のようsomeAppに呼び出すとb.sh、2つの引数を受け取ります。

b.sh 'My first' 'My second'

ではsomeApp "$*"someApp単一の引数を受け取ることになりますMy first My second。ではsomeApp "$@"someApp二つの引数を受け取り、だろうMy firstMy second


24
見落としやすいのは、「$ @」を引用する必要があることです。$ @では不十分です。
miracle2k 14年

1
@ miracle2k正解。引用符で囲まれていない、$@$*全く同じ仕事。
chepner 2014年

2
@マットそれはまったく違うものです。「$ @」は、各引数を個別に引用するという点で特別です。したがって、複数の引数が生じる可能性があります。「$ something」は、$ somethingが展開されるものを囲む引用符であり、常に単一の引数になります。
カルロウッド

答えは私が設定した場合にのみ私のために機能しますIFS=$'\n'。なぜだかわかりません。
ドミニクM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.