bash - Bash 中的 "$@"和 "$*"有什么区别?

标签 bash variables command-line-arguments

<分区>

在我看来,它们都存储了所有的命令行参数。

那么两者有区别吗?

最佳答案

区别很微妙; "$*" 创建一个由 $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 为空,参数将在没有中间分隔符的情况下连接。

$@

扩展到位置参数,从一个开始。当扩展发生在双引号内时,每个参数都会扩展为一个单独的词。也就是说,"$@" 等同于 "$1""$2".... 如果双引号扩展出现在一个单词中,则第一个扩展参数与原词的开头部分相连,最后一个参数的扩展与原词的最后部分相连。当没有位置参数时,"$@"$@ 展开为空(即,它们被删除)。

关于bash - Bash 中的 "$@"和 "$*"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3008695/

相关文章:

powershell - 使用 Powershell -encodedcommand 传递参数

Python 和 argparse : how to vary required additional arguments based on the first argument?

perl - 如何在 Perl 语句中获取输入文件的名称?

linux - 获取 adb 日志并将其 grep 到 IF 语句中的字符串

bash - 处理由反引号命令产生的带有空格的路径

python - 使用 linux 别名运行(分离的)QProcess 并获得结果

css - 将绝对定位的基于变量的标题居中

linux - 文件名中的旧 rsync 和空格

java - 引用私有(private)变量时,是否需要this.variableName声明?

c# - app.config/web.config 中的变量