$* 在 shell 中意味着什么

$* 在 shell 中意味着什么

$*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_commandrun_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 个参数:abcdef。使用"$@"更安全(除非你想要分词)。

相关内容