例如,当您键入:
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-E
or-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$"..."
来检索它们)。