bash脚本中的$ @和$*之间的差异

Kyr*_*rol 5 bash

我是bash的新手,我正在学习它,而且我怀疑使用$@和之间的真正区别S*.

我在这里红色Bash特殊参数

我知道两者都扩展到位置参数,但差异发生在双引号内.顺便说一句"$@" = "$1" "$2"..."$n"可能不同于"S*" = "$1$2...$n".

我尝试用一​​个简单的脚本来理解它:

if [ $# -gt 0 ]; then
       echo "Your command line contains $# arguments" 
else
       echo "Your command line contains no arguments"
       exit  fi

echo "Params are: "
echo $@  
echo $* 
echo "$@"    
echo "$*"
Run Code Online (Sandbox Code Playgroud)

如果我像这样在终端中执行我的脚本 ~./my_script par1 par2 par3

结果总是一样的:

Params are:
par1 par2 par3
par1 par2 par3
par1 par2 par3
par1 par2 par3
Run Code Online (Sandbox Code Playgroud)

也许我不明白这两个特殊变量的实际用途以及我的例子是否正确.我想用一个很好的例子来弄清楚这一点.

fed*_*qui 3

来自http://tldp.org/LDP/abs/html/refcards.html

"$*" 所有位置参数(作为单个单词)*

“$@” 所有位置参数(作为单独的字符串)

此代码显示了这一点:给定一个由空格分隔的项目的字符串,$@将每个单词视为一个新项目,同时$*将它们全部视为相同的参数。

echo "Params for: \$@"
for item in "${@}"
do
        echo $item --
done

echo "Params for : \$*"
for item in "${*}"
do
        echo $item --
done
Run Code Online (Sandbox Code Playgroud)

测试:

$ ./a par1 par2 par3
Your command line contains 3 arguments
Params for: $@
par1 --
par2 --
par3 --
Params for : $*
par1 par2 par3 --
Run Code Online (Sandbox Code Playgroud)