在 bash 函数调用中使用“echo”和“printf”

Siv*_*ari 10 bash shell-script

我有一个简单的 shell 函数调用,我正在使用echoprintf命令来打印我传递的参数。我注意到以下几点:

  1. echo 正在打印输出
  2. printf 不打印输出

我在这里错过了什么吗?

check_host(){
    # prints output
    echo $1

    # does not print the output
    printf $1

    }
check_host $(hostname)
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 13

您显示的函数将打印第一个参数两次,一次附加换行符,第二次输出的末尾没有换行符

例如,在交互式 Bash shell 中,你会得到这样的东西

user@foo /tmp$ check_host foo
foo
foouser@foo /tmp$ 
Run Code Online (Sandbox Code Playgroud)

输出printf 在那里,只是不在自己的一行上。

之间的区别echo,并printfecho打印在最后一个换行,即使你不问它(您可以防止在Bash中使用echo -n),以及printf作品更像是printf()在C函数,因为它只打印你的要求。您必须\nprintf格式字符串中显式使用以获取换行符。

请注意,一般而言,您需要引用这些变量和命令替换,以防止出现分词问题。这可能不是主机名的问题,但如果您有带有空格的值,您将需要它。

所以:

check_host() {
    echo "$1"
    printf "%s\n" "$1"
}
check_host "$(hostname)"
Run Code Online (Sandbox Code Playgroud)

printf也应该通过%s上面的格式说明符来打印任意数据。否则%数据中的任何符号都会被 解释printf

另请参阅:为什么 printf 比 echo 好?