$*
シェルではどういう意味ですか?
2つの関数のコードがあり、run_command
次run_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"
$*
ab
、cd
および3つのパラメータが提供されますef
。 (単語を分割したくない限り)使用する方が"$@"
安全です。