$*
shell中的意思是什么?
我有两个函数的代码,run_command
并且run_test
它们的调用方式如下:
if [ -n "`echo ${GOAT_COMMANDS} | grep $1`" ]; then
run_command $*
else
run_test $*
fi
我想了解这是什么$*
意思,但是谷歌搜索对于搜索这类东西来说非常糟糕。
答案1
$*
是所有参数对于脚本或函数,在空格上分成单独的参数。
如果你有一个函数:
foo() {
for x in $*
do
echo $x
done
}
然后运行foo 1 "2 3 4" 5
会输出:
1
2
3
4
5
也就是说,带引号的字符串"2 3 4"
将被分成三个单独的“单词”。
当你不想要将参数分成单独的单词,您可以使用$@
.如果使用相同的函数"$@"
代替$*
,它将输出:
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"
$*
将为您提供 3 个参数:ab
、cd
和ef
。使用"$@"
更安全(除非你想要分词)。