Bash中的“$@”和“$*”有什么区别?

参见英文答案 > What is the difference between $@ and $* in shell scripts?3答案在我看来,他们都存储所有的命令行参数。

那么两者之间有区别吗?

区别是微妙的; “$ *”创建一个由$ IFS变量分隔的参数,而“$ @”将扩展为单独的参数。例如,考虑:
for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done

使用多个参数运行时:

./testvar foo bar baz 'long arg'
@ 'foo'
@ 'bar'
@ 'baz'
@ 'long arg'
* 'foo bar baz long arg'

更多细节:

http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters

$ *

扩展为位置参数,从一个开始。当扩展出现在双引号内时,它扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔。也就是说,“$ *”等价于“$ 1c $ 2c …”,其中c是IFS变量值的第一个字符。如果未设置IFS,则参数由空格分隔。如果IFS为null,则连接参数时不插入分隔符。

$ @

扩展为位置参数,从一个开始。当扩展出现在双引号内时,每个参数扩展为单独的单词。也就是说,“$ @”等价于“$ 1”“$ 2”….如果在单词中出现双引号扩展,则将第一个参数的扩展与原始单词的开头部分合并,最后一个参数的扩展与原始单词的最后一部分连接。当没有位置参数时,“$ @”和$ @展开为无(即,它们被删除)。

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...