如何使用printf"%q"在bash?

时间:2016-11-13 12:30:38

标签: 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函数的原始扩充。

为什么输出和原始增量不同? 或者我可以打印出原始的增强片吗?

非常感谢。

1 个答案:

答案 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'