echo 中双引号变量或整行有区别吗

echo 中双引号变量或整行有区别吗

例如,当您键入:

echo Variable "$var" is not initialised.

echo "Variable $var is not initialised."

前端结果是完全相同的(至少据我所知)。但我想知道,从echo的角度来看,命令的运行方式是否有任何差异。

从性能角度来看,后者是否更快,因为echo会立即收到所有参数?

答案1

echo Variable "$var" is not initialised.

您将 5 个参数传递给echo(6 如果您计数echo,则argv[0])echo将输出它们,它们之间以空格字符分隔,并以换行符结尾。

在:

echo "Variable $var is not initialised."

您正在传递 1 个参数(如果算的话则为 2 个echo)。

在这种特殊情况下以及大多数情况下,这在功能上是等效的。

第二个意味着 shell 在运行之前解析命令并将其存储到参数中的工作更少,并且检查其参数的echo工作也更少。echo

这不太可能在性能方面产生非常显着的差异。在我的测试中,我发现它与某些echo/shell组合(如其bash内置)有微小的差异,但在其他组合中几乎没有任何差异。

您可能想要传递一个参数而不是多个参数的其他原因:

  • 如果您希望参数之间有多个空格:echo a b将输出a b,则需要echo 'a b'输出a b

  • 在诸如 之类的事情中echo "$opt" is an invalid option,对于某些echo实现(例如echo的内置bash),不能与opt=-e(or -Eor -neE...) whileecho "$opt is an invalid option"一起使用。

  • 在 中echo foo bar,您传递 2 个参数(除了echo第一个参数之外),每个参数长 3 个字节,即 2 个指针(在 64 位系统上每个指针 8 个字节)和 8 个字节(包括\0实际字符串的字符串分隔符),因此在 64 位系统上总共 24 个字节。

    虽然它是一个指针和 8 个字节echo 'foo bar'(总共 16 个字节)。当使用大量参数调用外部echo可执行文件时,这可以使您更快达到参数大小的限制(尽管请注意,Linux 对单个参数的最大大小也有限制 (128KiB))。

在任何情况下,对于任意数据(比如$var我们不知道其内容的数据(尽管从这里的上下文我们可以得出它只包含数字和下划线)),您想要使用printf,而不是echo

printf >&2 '%s\n' "Variable $var is not initialised."

或者:

printf >&2 'Variable %s is not initialised.' "$var"

(这里发送到 stderr,因为这看起来对用户来说是一个错误,而不是脚本生成的正常输出的一部分)。

在这种情况下,除了格式之外,它还必须是传递给printf.

该方法的另一个优点是,它可以用用户的语言翻译消息,您可以Variable %s is not initialised.在所有支持的语言中提供该格式的现成翻译(并使用gettext或 ksh93/bash$"..."来检索它们)。

相关内容