2013-03-21 156 views
0

哪种形式最有效?Bash变量级联

1)

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

2)

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

假设可读性都是一模一样的给你,这是一个延伸,将1)的意思是创建并扔掉一些字符串immutables(如在Python中)还是充当定期扩展缓冲区容量的Java“StringBuffer”?在Bash内部如何处理字符串连接?

如果2)和1)一样可读,那么反引号是否会产生子壳,并且这会更昂贵,即使它可能比1)中没有的操作更具成本效益?

回答

2

好,最简单,最有效的机制将选择0:

v="abc" 

第一种机制涉及四个任务。

第二种机制是奇怪的(并且绝对不可读)。它(名义上)在两个子shell(两个` `部分)中运行一个空命令,并将输出(一个空字符串)与三个常量连接起来。如果shell只是执行back-tick命令而不注意它们是空的(并不是不合理的,它不会注意到;这是一个奇怪的事情 - 我不记得在我以前的30年中看到它完成了的shell脚本),这肯定要慢得多。因此,只给出选项(1)和(2),使用选项(1),但通常使用上面显示的选项(0)。

为什么你会像这样零碎地建立起这根弦?你的例子中缺少的东西使原始代码变得明智,但缩减的代码显得不那么明智。

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

这会更有意义,特别是在使用各$x$y$z后,和/或使用的$v中间值(可能在由三重圆点表示的命令)。所使用的连接符号将适用于任何Bourne-shell衍生物;替代+= shell将使用更少的shell,但可能稍微更高效(重点在于“略微”)。

+0

解析器不应该注意到反引号内缺少令牌,而是折叠为“no-op”,这是非常奇怪的。无论如何,你是对的..零星的变量在其他地方使用..我压缩了这个例子。 – Robottinosino 2013-03-21 02:03:18

+0

30年的脚本..哇,顺便说一句。我尊敬地鞠躬!感谢您的回答!你碰巧知道字符串连接在内部是如何工作的吗?我想可以看看源代码。 – Robottinosino 2013-03-21 02:06:17

+0

我从来没有见过任何人不想在子shell中运行并捕获输出。也许是灵感来自Python的知识吗?我没有看,但如果shell没有为每个变量的值使用可变字符串,我会感到惊讶。像Python一样不可变的是一个更近的想法。 – 2013-03-21 02:06:35

0

便携式和直接的方法是使用双引号和大括号的变量:

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

,你甚至可以设置默认值空变量使用花这样

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

括号可防止出现$VARa而您想写${VAR}a但最终得到${VARa}的内容

+1

您的意见是准确的,但并不真正解决问题。 – 2013-03-21 02:12:27

+0

@JonathanLeffler - 是的,你已经解决了这个问题,我正在解决效率的另一面 - 编写它,以便在添加新变量时不会中断......而双引号比效率更高(可读) ''单引号周围的文字和粉碎'$ VARS'像这样'' – technosaurus 2013-03-21 02:18:03

+0

行;也许你应该解释你在说什么。我希望看到双引号比单引号“效率更高”的证据。对于shell来说,单引号实际上更容易处理,但差异可以忽略不计,因此对于大多数实际用途而言,它们将是相同的。我同意双引号是'更具可读性'(并且在编程人员使用时更加高效),尤其是如果您需要将变量插入到字符串中。 – 2013-03-21 02:26:30