为什么Bourne shell printf迭代%s参数?

时间:2008-09-03 16:30:51

标签: unix shell

这里发生了什么?

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”(出于此原因和其他原因)。

4 个答案:

答案 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},它使用不同的参数输出三次字符串