繁体   English   中英

如何在 bash 中使用 printf “%q ”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM