我对在bash中打印包含新行符号的变量感到困惑。
var="Age:\n20\ncolor:\nred"
echo -e $var
Age:
20
color:
red
这很有效,但是很多人都说选项的回音是not portable和it is better to use printf。
我从未使用过prinf。根据手册发出echo命令:
printf '%s\n' "$var"
Age:\n20\ncoloe:\nred
但这并没有解析内部变量。手册通常有这个例子:
printf "Surname: %s\nName: %s\n" "$SURNAME" "$LASTNAME"
但这不是我的情况,从我的观点来看,使用起来并不舒服。我只是通过键入我发现我可以使用它:
printf“$ var \ n”
可携带吗? 如果我然后将$ var传递给邮件命令,它会保存新的换行符吗?
printf "$var\n" | mail -s subj email@domain.com
答案 0 :(得分:22)
printf
的{{1}}格式说明符专门用于替换%b
(实际上,是echo -e
的XSI扩展,默认情况下会调用对参数的特殊解释。永远不会指定echo
并且POSIX不允许{。}},并且几乎在所有方面都是相同的,包括与-e
和格式字符串参数之间的一些差异$'...'
。
printf
除非程序控制确切的值,否则通常应避免将变量扩展为格式字符串,并且特别是格式字符串。由于 $ ( var='Age:\n20\ncolor:\nred'; printf '%b\n' "$var" )
Age:
20
color:
red
的{{1}}选项,你的最后一个例子特别有可能在Bash中非常危险。
printf
除非您有特殊的可移植性要求,否则通常应避免使用-v
。将转义码存储在变量而不是文字数据中违反了代码和数据分离的原则。有一些上下文可以,但通常最好使用# Bad!
var='-v_[$(echo "oops, arbitrary code execution" >&2)0]'
printf "$var" foo
引用来分配值,该引用是为下一个版本的POSIX指定的,并且长期以来以Bash和大多数ksh风格可用。< / p>
%b