为什么 Bourne shell printf 会迭代 %s 参数?
题
这里发生了什么?
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
“(出于这个原因和其他原因)。
解决方案
您的 NAME 变量将被替换如下:
printf "Hello, %s\n" George W. Bush
用这个:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
其他提示
您使用 printf 是否有具体原因,或者 echo 也适合您?
NAME="George W. Bush"
echo "Hello, "$NAME
结果是
Hello, George W. Bush
编辑:它迭代“George W.Bush”是因为伯恩外壳是由空间界定的。要继续使用 printf,您必须将 $NAME 放在双引号中
printf "Hello, %s\n" "$NAME"
我的解释方式 手册页 它是否将您传递给它的字符串视为参数;如果您的字符串有空格,它会认为您正在传递多个参数。我相信 ColinYounger 用引号将变量括起来是正确的,这会强制 shell 将字符串解释为单个参数。
另一种方法可能是让 printf 扩展变量:
printf "Hello, $NAME."
这些链接适用于 bash,但我很确定同样适用于 sh。
如果您希望将所有这些单词单独打印出来,请使用 打印 代替 打印函数
打印函数 获取格式规范并将其应用于您传入的每个参数。由于您有三个参数 {George, W., Bush},因此它使用不同的参数输出字符串三次。
不隶属于 StackOverflow