[英]How to use printf “%q ” in bash?
我想将函数的扩充打印到文件中。 有人告诉我一个命令 printf "%q ",其指令如下,
# man printf
%q ARGUMENT is printed in a format that can be reused as shell input, escaping non-print‐
able characters with the proposed POSIX $'' syntax.
在上述说明的基础上,我尝试了以下代码。
#!/bin/bash
# file name : print_out_function_augs.sh
output_file='output.txt'
function print_augs() {
printf "%q " "$@" >> "${output_file}"
echo >> "${output_file}"
}
print_augs a 'b c'
cat "${output_file}"
rm "${output_file}"
并运行
bash print_out_function_augs.sh
结果如下,
a b\ c
我期望结果为
a 'b c'
这是对 print_augs 函数的原始扩充。
为什么输出和原始增广不同? 或者我可以按原样打印出原始增强吗?
非常感谢。
使用%q
时请记住这一点:
ARGUMENT 以可重复用作 shell 输入的格式打印,使用建议的 POSIX $'' 语法转义不可打印的字符。
强调我的。 只要输入可以在 shell 中重用, printf
就可以以任何它喜欢的方式自由地重新格式化参数。 但是,这不是您的输入看起来如此的原因。
在 Bash 中, '
字符是一个字符串分隔符,这就是你告诉 bash “以下字符串包含特殊字符(如空格,这些特殊字符不应被 Bash 解析)的方式”。 引号不会传递给被调用的命令。 命令看到的是这样的:
Command:
printf "%q" a 'b c'
Received args:
printf::arg0: printf
printf::arg1: %q
printf::arg2: a
printf::arg3: b c
请注意, arg3
周围没有引号。 Bash 不会传递它们。
当printf
打印出 args 时,它不知道bc
周围有引号,因此它不会打印它们。 但它确实知道 'b' 和 'c' 之间的空格是一个特殊的 shell 字符,并将\\
放在前面以对其进行转义。
这适用于所有 bash 函数/命令,因此请记住,当您调用print_augs
也会发生同样的情况。
如果要在字符串周围保留引号,则需要将它们双引号,以便 Bash 不会解析它们:
function print_augs2() {
echo "$@" >> "${output_file}"
}
print_augs2 a "'b c'"
# Output: a 'b c'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.