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

时间:2020-03-05 18:47:08  来源:igfitidea点击:

这里发生了什么?

printf.sh:

#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME

命令行会话:

$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush

更新:printf"你好,%s \ n"" $ NAME"有效。关于为什么我不使用echo的原因,请考虑

echo.sh:

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

命令行:

$ ./echo.sh
Filename: C:    mp

POSIX规范对" echo"的描述是:"出于这个原因和其他原因,鼓励新应用程序使用printf而不是echo"。

解决方案

回答

如果我们想单独打印所有这些单词,请使用print而不是printf

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

回答

我们使用printf是否有特定原因,或者echo也可以为我们工作?

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

结果是

Hello, George W. Bush

编辑:
之所以要在"乔治·W·布什"上进行迭代,是因为伯恩弹壳是用空间来界定的。要继续使用printf,必须将$ NAME放在双引号中

printf "Hello, %s\n" "$NAME"

回答

NAME变量将被替换为:

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

用这个:

#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"

回答

我解释手册页的方式是将我们传递给它的字符串视为一个参数。如果字符串中有空格,则认为我们正在传递多个参数。我相信ColinYounger将变量用引号引起来是正确的,这迫使外壳程序将字符串解释为单个参数。

一种替代方法是让printf扩展变量:

printf "Hello, $NAME."

这些链接用于bash,但我敢肯定,sh也是如此。