$*はシェルで何を意味しますか?

$*はシェルで何を意味しますか?

$*シェルではどういう意味ですか?

2つの関数のコードがあり、run_commandrun_testのように呼び出されます。

if [ -n "`echo ${GOAT_COMMANDS} | grep $1`" ]; then
  run_command $*
else
  run_test $*
fi

これが何を意味するのかを理解したいのですが、$*Googleはこの種の検索を正しく実行しません。

答え1

$*はいすべてのパラメータスクリプトまたは関数の場合は、引数をスペースで区切ります。

機能がある場合:

foo() {
    for x in $*
    do
        echo $x
    done
}

その後、実行すると以下foo 1 "2 3 4" 5が出力されます。

1
2
3
4
5

つまり、引用符付き文字列は"2 3 4"3つの別々の「単語」に分割されます。

いいえ引数を別の単語に分割するには、を使用できます。代わりに$@同じ関数を使用すると、次のものが出力されます。"$@"$*

1
2 3 4
5

つまり、引用符付き文字列は別の単語に分割されません。これは、すべての位置パラメータを明示的に一覧表示するのと同じです"$1" "$2" "$3" "$4" ...。通常、これはおそらくあなたが使用したいものです。単語の分割は、しばしば追跡するのが難しい不快なエラーにつながります。

関数の内部ではなく、スクリプトの最上位レベルでは、これはスクリプト自体に与えられた引数を参照します。

run_commandあなたの例では、一部またはrun_testすべての引数を使用してこのスクリプトまたは関数を呼び出し、それを別の単語に分割します。スクリプトがscript.sh "hello world" 2 3次のように実行されると、次の効果が表示されます。

run_command hello world 2 3

答え2

$*すべてのパラメータを単一の「引数」として関数に渡すことを意味します。また、これらの変数の周りに二重引用符を使用することをお勧めします"$*"

これに関するいくつかの文書ここセクション3.2.5

一方、パラメータリストに含まれる各パラメータを繰り返す必要がある場合は、次の$@例のように代わりに使用してください。

for var in "$@"
do
    echo "$var"
done

別の例は次のとおりです。 foo.sh

#!/bin/bash    
foo1()
{
        for x in "$@"
        do
                echo "f1: $x"
        done
}

foo2()
{
        for x in "$*"
        do
                echo "f2: $x"
        done
}

foo1 1 2 "3 4 5" 6 7
echo
foo2 1 2 "3 4 5" 6 7

出力:

$  ./foo.sh 
f1: 1
f1: 2
f1: 3 4 5
f1: 6
f1: 7

f2: 1 2 3 4 5 6 7

答え3

$*すべてを意味位置パラメータ

答え4

$*位置パラメータのリストですが、単語分割機能があります。例えば、

your_script ab "cd ef"

$*abcdおよび3つのパラメータが提供されますef。 (単語を分割したくない限り)使用する方が"$@"安全です。

関連情報