我有一个简单的 shell 函数调用,我正在使用echo
和printf
命令来打印我传递的参数。我注意到以下几点:
echo
正在打印输出printf
不打印输出
我在这里错过了什么吗?
check_host(){
# prints output
echo $1
# does not print the output
printf $1
}
check_host $(hostname)
答案1
您显示的函数将打印第一个参数两次,一次附加换行符,一次打印没有换行符在第二个输出的末尾。
例如,在交互式 Bash shell 中,您会得到类似这样的内容
user@foo /tmp$ check_host foo
foo
foouser@foo /tmp$
输出来自printf
是在那里,只是不在一条线上。
echo
和之间的区别在于,printf
即使echo
您没有要求,也会在末尾打印换行符(您可以在 Bash 中使用 来阻止这种情况echo -n
),并且printf
工作方式更像printf()
C 中的函数,因为它只打印您要求的内容。您必须\n
在printf
格式字符串中显式使用才能获取换行符。
请注意,一般来说,您需要引用这些变量和命令替换,以防止出现分词问题。这可能不是主机名的问题,但如果您的值带有空格,则需要它。
所以:
check_host() {
echo "$1"
printf "%s\n" "$1"
}
check_host "$(hostname)"
打印任意数据printf
也应该通过上面的格式说明符来完成%s
。否则%
数据中的任何符号都将由 解释printf
。