9

这里发生了什么?

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,请考虑

回声.sh:

#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"

命令行:

$ ./echo.sh
Filename: C:    mp

POSIX 规范echo说, “鼓励使用新应用程序printf而不是echo”(出于这个和其他原因)。

4

4 回答 4

7

您的 NAME 变量被这样替换:

printf "Hello, %s\n" George W. Bush

用这个:

#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
于 2008-09-03T16:40:09.730 回答
1

您使用 printf 是否有特定原因,或者 echo 也适合您?

NAME="George W. Bush"
echo "Hello, "$NAME

结果是

Hello, George W. Bush

编辑:它迭代“George W. Bush”的原因是因为 bourne shell 是空格分隔的。要继续使用 printf,您必须将 $NAME 放在双引号中

printf "Hello, %s\n" "$NAME"
于 2008-09-03T16:39:41.133 回答
1

我解释手册页的方式是将您传递给它的字符串视为参数;如果您的字符串有空格,它认为您正在传递多个参数。我相信 ColinYounger 通过用引号将变量括起来是正确的,这会强制 shell 将字符串解释为单个参数。

另一种方法可能是让 printf 扩展变量:

printf "Hello, $NAME."

这些链接适用于 bash,但我很确定 sh 也是如此。

于 2008-09-03T16:45:35.300 回答
0

如果您希望所有这些单词都自己打印出来,请使用print而不是printf

printf采用格式规范并将其应用于您传入的每个参数。由于您有三个参数 {George, W., Bush},它使用不同的参数输出字符串三次。

于 2008-09-03T16:39:02.180 回答