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

Why use 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 表示后面的 space 分隔字符串的字符串占位符,“\n”表示换行符。

%s 然后将替换为“未输入任何输入”,然后换行。

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

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

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

printf 'No input entered\n'

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

但是如果数据来自变量,您会想要使用

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

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

例如在 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 的参数。第二,错误信息应该有解释。