我想将函数的扩充打印到文件中。 我被告知命令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函数的原始扩充。
为什么输出和原始增量不同? 或者我可以打印出原始的增强片吗?
非常感谢。
答案 0 :(得分:11)
使用%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时,它不知道 b c
周围有引号,因此它不会打印它们。但它确实知道' b'之间的空间。和' c'是一个特殊的shell字符,并将\
放在前面以逃避它。
对于所有bash函数/命令都是如此,因此请记住,当您调用print_augs
时也会发生同样的情况。
如果你想在字符串周围保留引号,你需要加倍引用它们,以便Bash不解析它们:
function print_augs2() {
echo "$@" >> "${output_file}"
}
print_augs2 a "'b c'"
# Output: a 'b c'