【发布时间】:2021-12-30 15:28:58
【问题描述】:
$@ 当双引号("$@") 扩展为 "$1" "$2" "$3" ...
似乎没有简单的方法可以打印“$@”中的引用形式
$ set -- "one two" three
$ echo "$@"
one two three
我正在寻找的是,输出
'one two' three
使用 'set -x' 是否会在 "$@" 中回显带引号的参数形式
$ set -x; echo "$@"; set +x
+ set -x
+ echo 'one two' three
one two three
+ set +x
用户定义的变量 $DOLLAR_AT 里面包含相同的东西,就像 "$@" 包含
$ DOLLAR_AT="'one two' three"
转储 $DOLLAR_AT 里面的内容,使用“echo”按预期工作
$ echo $DOLLAR_AT
'one two' three
由于 shell 对包含特殊字符的参数进行了某种自动引用
$ set -x; echo $DOLLAR_AT; set +x
+ echo ''\''one' 'two'\''' three
+ set +x
不清楚原因
$ echo "$@"
不会产生与
相同的输出$ echo "$DOLLAR_AT"
当使用接收到的“$@”从 shell 脚本启动命令时,有一个 在调用 命令。
打印输出从 一个 bash 数组。
$ CMDARGS=("one two" "three")
在双引号内计算数组不会以带引号的形式打印数组元素
$ echo "${CMDARGS[@]}"
one two three
我还需要一种紧凑的方式来打印引用的 $CMDARGS[@] 中的内容 类似于本次迭代的形式
$ for ARG in "${CMDARGS[@]}"; do echo \'$ARG\'; done
'one two'
'three'
【问题讨论】:
-
引号通常被调用您的脚本的(交互式)shell 吃掉。引号的效果(对多字值进行分组)在您的代码运行时已经发挥了作用。值
one two已分配给$1。 -
一般来说,如果你想以转义形式传递值,例如传递/调用另一个脚本时,那么你可以使用
printf %q。它自动转义值,以便它们按原样传递到下一个程序。它不使用引号,而只是反斜杠转义空格,这具有相同的最终结果。 -
需要在 "$@" 或 "${ARRAY[@]}$" 中打印参数,就像在调用它之前传递给被调用脚本一样。
-
@user3477071 但是为什么?考虑
printf '%s\n' "$@"。它将在一行打印one two,在下一行打印three。仅仅因为缺少引号并不意味着您没有保留两个参数之间的区别。 -
您的
for循环已经一次向您显示每个参数;引号没有给你任何额外的信息。