为什么使用 printf '%s\n' "message"?

问题描述

if [[ -z "$usr_name" ]]; then
   printf '%s\n' "No input entered"
   exit 1

'%s\n' 的含义是什么,为什么要添加它而不是仅仅使用:

printf "No input entered"

解决方法

printf 用于格式化和打印数据。在以下情况下:

printf '%s\n' "No input entered"

%s 表示后面的空格分隔字符串的字符串占位符,“\n”表示换行。

%s 将被替换为“未输入任何内容”,后跟一个换行符。

,

这是一种防御性编程技术,希望防止格式字符串包含意外指令或参数数量与格式字符串不匹配的错误。此外,通过将字符串放入参数中,可以减少不必要的转义。 (比较 printf '20%%\n'printf '%s\n' '20%')而且,它使读者更容易看到格式,有助于防止忘记尾随换行符的错误。

底线:这是一个风格决定。之间没有功能差异:

printf '%s\n' "No input entered"

printf 'No input entered\n'
,

像这样一个固定的漂亮的字符串,没有太大区别。

但是如果数据来自一个变量,你会希望使用

printf "%s\n","$var"

而不是扩展格式字符串中的变量,以防止变量本身包含格式说明符(如 %s)的可能性,以破折号开头,这将是作为一种选择。

例如在 Bash 中:

$ var=%s
$ printf "$var\n"

$ var=-foo
$ printf "$var\n"
bash: printf: -f: invalid option
printf: usage: printf [-v var] format [arguments]

这是第一个 printf 输出的空行,因为没有用于填充 %s 的参数。第二,错误信息应该解释一下。