我对在bash中打印包含新行符号的变量感到困惑.
var="Age:\n20\ncolor:\nred"
echo -e $var
Age:
20
color:
red
Run Code Online (Sandbox Code Playgroud)
这是有效的,但是很多人说使用选项的回声是不可移植的,并且最好使用printf.
我从来没用过prinf.根据手册发出echo命令:
printf '%s\n' "$var"
Age:\n20\ncoloe:\nred
Run Code Online (Sandbox Code Playgroud)
但是这并没有解析内部变量.手册通常有这个例子:
printf "Surname: %s\nName: %s\n" "$SURNAME" "$LASTNAME"
Run Code Online (Sandbox Code Playgroud)
但这不是我的情况,从我的观点来看,使用起来并不舒服.我只是通过键入我发现我可以使用它:
printf"$ var \n"
它是便携式的吗?如果我然后将$ var传递给邮件命令,它会保存新的换行符吗?
printf "$var\n" | mail -s subj email@domain.com
Run Code Online (Sandbox Code Playgroud)
orm*_*aaj 22
printf的%b格式说明是专门用来取代echo -e(实际上,在XSI扩展echo其要求的默认参数特殊解释.-e从来没有指定,并通过POSIX禁止.),并且是相同在几乎每一个方式,包括从几个不同$'...'和格式字符串参数printf.
$ ( var='Age:\n20\ncolor:\nred'; printf '%b\n' "$var" )
Age:
20
color:
red
Run Code Online (Sandbox Code Playgroud)
您通常应该避免将变量扩展到格式字符串,除非您的程序控制确切的值,并且它专门用作格式字符串.特别是你的最后一个例子在Bash中有可能是非常危险printf的-v.
# Bad!
var='-v_[$(echo "oops, arbitrary code execution" >&2)0]'
printf "$var" foo
Run Code Online (Sandbox Code Playgroud)
%b除非您有特殊的可移植性要求,否则通常都应避免使用.将转义码存储在变量而不是文字数据中违反了代码和数据分离的原则.有一些上下文可以,但通常最好使用$'...'引用来指定值,该引用是为下一个版本的POSIX指定的,并且长期以来以Bash和大多数ksh风格可用.
x=$'foo\nbar'; printf '%s\n' "$x" # Good
x=(foo bar); printf '%s\n' "${x[@]}" # Also good (depending on the goal)
x='foo\nbar'; printf '%b\n' "$x" # Ok, especially for compatibility
x='foo\nbar'; printf -- "$x" # Avoid if possible, without specific reason
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24204 次 |
| 最近记录: |