为什么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也是如此。