“$@” 是双引号的例外吗?

“$@” 是双引号的例外吗?

通常情况下,双引号内的内容算作一个单词,因此在使用“...”调用程序时,它算作一个参数。“$@”是否是个例外,因为它被拆分成与传递给 shell 脚本的参数一样多的单词?

答案1

某种程度上是,但也不是。这是一种不同的分裂。

$@指的是数组;Bash 还允许常规变量为数组,并支持类似${var[*]}或 的扩展${var[@]}。后者还可以扩展为所有值$var 作为单独的单词。

但是,如果扩展是在双引号内,那么每个单独的值仍然表现得就像被引用一样——即不会发生分词。因此尊重 – $@vs仍然与vs"$@"相同。$foo"$foo"

演示

$ var=("项目 1" "项目 2 有空格" "项目 3?项目 3.")

$ 声明 -p var
声明 -a var=([0]="项目 1" [1]="项目 2 有空格" [2]="项目 3?项目 3.")

$ 参数“${var[*]}”
argc = 2
argv[0] = 参数
argv[1] = 项目 1 项目 2 有空格 项目 3?项目 3。

$ 参数“${var[@]}”
argc = 4
argv[0] = 参数
argv[1] = 项目 1
argv[2] = 第 2 项有空格
argv[3] = 项目 3? 项目 3.

$ 参数 ${var[@]}
argc = 11
argv[0] = 参数
argv[1] = 项目
argv[2] = 1
argv[3] = 项目
argv[4] = 2
argv[5] = 有
...

相关内容