$ @和" $ @"之间有什么区别吗?

时间:2016-05-10 14:11:38

标签: bash expansion

$@"$@"之间有什么区别吗?

我知道非特殊字符可能存在差异,但是带有输入参数的@符号呢?

2 个答案:

答案 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'