【发布时间】:2010-09-07 17:02:45
【问题描述】:
这是怎么回事?
printf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
命令行会话:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
更新:printf "Hello, %s\n" "$NAME" 有效。为什么我不使用echo,请考虑
echo.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
命令行:
$ ./echo.sh
Filename: C: mp
POSIX spec for echo 表示,“鼓励新应用程序使用 printf 而不是 echo”(出于此原因和其他原因)。
【问题讨论】:
-
bash 内置回声默认情况下不会执行 \ 替换,但 POSIX shell(例如破折号)回声会执行,正如您指向规范的链接所示。由于您无论如何都在使用外壳,因此您可以 printf "Hello, $NAME\n"
-
实际上,出于安全性和正确性的原因,使用 %s 可能是一个好习惯。 printf 将对格式字符串进行 \ 替换和其他操作,因此请尽可能避免使用变量。