哪种形式最有效?
1)
v=''
v+='a'
v+='b'
v+='c'
2)
v2='a'` `'b'` `'c'
假设可读性对你来说是完全一样的,这是一个延伸,1)是否意味着创建和丢弃一些不可变的字符串(如在 Python 中)或充当 Java“StringBuffer”并定期扩展缓冲区容量?在 Bash 内部如何处理字符串连接?
如果 2) 对您来说与 1) 一样可读,那么反引号是否会产生子外壳,并且即使作为潜在的“无操作”,它是否会比 1) 中的操作更昂贵?
哪种形式最有效?
1)
v=''
v+='a'
v+='b'
v+='c'
2)
v2='a'` `'b'` `'c'
假设可读性对你来说是完全一样的,这是一个延伸,1)是否意味着创建和丢弃一些不可变的字符串(如在 Python 中)或充当 Java“StringBuffer”并定期扩展缓冲区容量?在 Bash 内部如何处理字符串连接?
如果 2) 对您来说与 1) 一样可读,那么反引号是否会产生子外壳,并且即使作为潜在的“无操作”,它是否会比 1) 中的操作更昂贵?
好吧,最简单和最有效的机制是选项 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
+=
可移植且直接的方法是对变量使用双引号和大括号:
VARA="beginning text ${VARB} middle text ${VARC}..."
您甚至可以通过这种方式为空变量设置默认值
VARA="${VARB:-default text} substring manipulation 1st 3 characters ${VARC:0:3}"
使用大括号可以防止出现 a$VARa
并且您想编写${VAR}a
但最终得到的内容的情况 ${VARa}