0

哪种形式最有效?

1)

v=''
v+='a'
v+='b'
v+='c'

2)

v2='a'` `'b'` `'c'

假设可读性对你来说是完全一样的,这是一个延伸,1)是否意味着创建和丢弃一些不可变的字符串(如在 Python 中)或充当 Java“StringBuffer”并定期扩展缓冲区容量?在 Bash 内部如何处理字符串连接?

如果 2) 对您来说与 1) 一样可读,那么反引号是否会产生子外壳,并且即使作为潜在的“无操作”,它是否会比 1) 中的操作更昂贵?

4

2 回答 2

2

好吧,最简单和最有效的机制是选项 0:

v="abc"

第一种机制涉及四个分配。

第二种机制很奇怪(而且绝对不可读)。它(名义上)在两个子外壳(两个` `部分)中运行一个空命令,并将输出(一个空字符串)与三个常量连接起来。如果 shell 只是简单地执行了反引号命令而没有注意到它们是空的(它不会注意到它并不是不合理的;尝试这是一件奇怪的事情——我不记得在我之前的 30 年中看到过它shell脚本),这肯定要慢得多。

因此,仅给定选项 (1) 和 (2),请使用选项 (1),但一般情况下,请使用上面显示的选项 (0)。

你为什么要像那样零碎地建立字符串?您的示例中缺少的内容使原始代码变得合理,但简化后的代码显得不那么明智。

v=""
x=$(...)
v="$v$x"
y=$(...)
v="$v$y"
z=$(...)
v="$v$z"

这会更有意义,特别是如果您使用和以后的每个$x,和/或使用中间值(可能在由三个点表示的命令中)。所使用的连接表示法适用于任何 Bourne-shell 导数;替代外壳将使用更少的外壳,但可能效率更高(强调“稍微”)。$y$z$v+=

于 2013-03-21T01:59:22.103 回答
0

可移植且直接的方法是对变量使用双引号和大括号:

VARA="beginning text ${VARB} middle text ${VARC}..."

您甚至可以通过这种方式为空变量设置默认值

VARA="${VARB:-default text} substring manipulation 1st 3 characters ${VARC:0:3}"

使用大括号可以防止出现 a$VARa并且您想编写${VAR}a但最终得到的内容的情况 ${VARa}

于 2013-03-21T02:11:32.577 回答