$@
和"$@"
之间有什么区别吗?
我知道非特殊字符可能存在差异,但是带有输入参数的@
符号呢?
答案 0 :(得分:10)
是!
$ cat a.sh
echo "$@"
echo $@
让我们运行它:
$ ./a.sh 2 "3 4" 5
2 3 4 5 # output for "$@"
2 3 4 5 # output for $@ -> spaces are lost!
正如您所看到的,使用$@
会使参数在用作参数时“丢失”某些内容。有关详细说明,请参阅-for example- I just assigned a variable, but echo $variable shows something else。
来自GNU Bash manual --> 3.4.2 Special Parameters:
<强> @ 强>
($ @)从1开始扩展到位置参数。 :当 扩展发生在双引号内,每个参数扩展为a 单词。也就是说,“$ @”相当于“$ 1”“$ 2”....如果 双语扩张发生在一个词内,扩展了 第一个参数与原始的开头部分连接在一起 单词,并将最后一个参数的扩展与最后一个参数连接起来 原始单词的一部分。没有位置参数时 “$ @”和$ @扩展为空(即,它们被移除)。
答案 1 :(得分:5)
将$ @传递给命令会将所有参数传递给命令。如果参数包含空格,则命令会将该参数视为两个独立的参数。
传递&#34; $ @&#34;命令将所有参数作为带引号的字符串传递给命令。该命令将看到一个包含空格的参数作为包含空格的单个参数。
为了轻松可视化差异,编写一个函数,在循环中打印所有参数,一次一个:
#!/bin/bash
loop_print() {
while [[ $# -gt 0 ]]; do
echo "argument: '$1'"
shift
done
}
echo "#### testing with \$@ ####"
loop_print $@
echo "#### testing with \"\$@\" ####"
loop_print "$@"
使用
调用该脚本<script> "foo bar"
将产生输出
#### testing with $@ ####
argument: 'foo'
argument: 'bar'
#### testing with "$@" ####
argument: 'foo bar'