这里发生了什么?
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
”(出于此原因和其他原因)。
答案 0 :(得分:7)
您的NAME变量将被替换为:
printf "Hello, %s\n" George W. Bush
使用此:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
答案 1 :(得分:1)
是否有一个特定的原因,你正在使用printf或为你回应工作?
NAME="George W. Bush"
echo "Hello, "$NAME
结果
Hello, George W. Bush
编辑: 它正在迭代“乔治W.布什”的原因是因为bourne shell是空间划分的。要继续使用printf,您必须将$ NAME放在双引号中
printf "Hello, %s\n" "$NAME"
答案 2 :(得分:1)
我解释man page的方式是它认为你传递它的字符串是一个参数;如果你的字符串有空格,它认为你传递了多个参数。我相信ColinYounger是正确的,用引号包围变量,这会强制shell将字符串解释为单个参数。
另一种方法是让printf扩展变量:
printf "Hello, $NAME."
这些链接适用于bash,但我很确定sh适用。
答案 3 :(得分:0)
如果您希望自己打印所有这些字词,请使用打印代替 printf
printf 采用格式规范并将其应用于您传入的每个参数。由于您有三个参数{George,W.,Bush},它使用不同的参数输出三次字符串