这里发生了什么?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top