当双引号括起来时("$@"),会展开为"$1" "$2" "$3" ...
似乎没有简单的方法打印"$@"内部内容的引用形式。
$ set -- "one two" three
$ echo "$@"
one two three
What I am looking for is, output of
'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"
使用'echo'将$DOLLAR_AT内部的内容倒出,可以按预期工作
$ 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'
one two
已经被分配给$1
。 - Raxiprintf %q
。它会自动转义值,使它们原样传递到下一个程序中。它不使用引号,而是只反斜杠转义空格,这具有相同的最终结果。 - Raxiprintf '%s\n' "$@"
。它会在一行上打印one two
,在下一行上打印three
。只是因为缺少引号并不意味着您没有保留两个参数之间的区别。 - chepnerprintf "'%s' " "$@"; echo
- M. Nejat Aydinfor
循环已经逐个显示每个参数;引号不会给你任何额外的信息。 - chepner