通常情况下,双引号内的内容算作一个单词,因此在使用“...”调用程序时,它算作一个参数。“$@”是否是个例外,因为它被拆分成与传递给 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] = 有 ...