2013-03-21 4 views
0

Какая форма наиболее эффективна?Bash variable конкатенация

1)

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

2)

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

Предполагая, что читаемость были точно такими же вам, и это растягивать, будет 1) означает создание и выбрасывая несколько строк immutables (например, в Python) или действовать как Java «StringBuffer» с периодическим расширением буферной емкости? Как конкатенации строк обрабатываются внутри Bash?

Если 2) были так же читаемы для вас, как и 1), будут ли появляться задние ящики подошвы и будет ли это более дорогостоящим, даже как потенциальный «нет-op», чем то, что сделано в 1)?

ответ

2

Ну, самый простой и эффективный механизм был бы вариант 0:

v="abc" 

Первый механизм включает в себя четыре задания.

Второй механизм причудливый (и определенно не читается). Он (номинально) запускает пустую команду в двух суб-оболочках (две части ` `) и объединяет выходы (пустую строку) с тремя константами. Если оболочка просто выполняет команды back-tick, не замечая, что они пустые (и это не является необоснованным, что он не заметит, это странная вещь, чтобы попробовать - я не помню, чтобы это было сделано за предыдущие 30 лет сценариев оболочки), это, безусловно, намного медленнее.

Итак, учитывая только варианты (1) и (2), используйте опцию (1), но в целом используйте опцию (0), показанную выше.

Зачем вы строите струну по частям? Что не хватает в вашем примере, который делает оригинальный код разумным, но уменьшенный код показан менее разумным.

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

Это будет иметь больше смысла, особенно если использовать каждый из $x, $y и $z позднее, и/или использовать промежуточные значения $v (возможно, в командах, представленных тройных точек). Используемая запись конкатенации будет работать с любой производной Bourne-shell; альтернативная оболочка += будет работать с меньшим количеством снарядов, но, вероятно, немного более эффективна (с акцентом на «немного»).

+0

Очень странно, что синтаксический анализатор не должен замечать отсутствие токенов в обратных тактах, сворачиваясь на 'no-op'. Во всяком случае, вы правы .. по частям переменные используются где-то в другом месте. Я сжал пример. – Robottinosino

+0

30 лет сценариев .. whoa, BTW. Я поклонился! Спасибо за Ваш ответ! Вы знаете, как работает конкатенация строк внутри?Я полагаю, что можно посмотреть на источник. – Robottinosino

+0

Я никогда не видел никого, кто хотел бы запустить ничего в суб-оболочке и захватить вывод. Возможно, это вдохновлено знанием Python? Я не смотрел, но я был бы поражен, если бы оболочка не использовала изменяемые строки для значения каждой переменной. Неизменяемость, как в Python, - это гораздо более новая идея. –

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

Ваши комментарии точны, но на самом деле не затрагивают вопрос. –

+0

@JonathanLeffler - да, вы уже обращались к этой части, я обращался к другой стороне эффективности - записывая ее, чтобы она не прерывалась при добавлении новых переменных ... и двойные кавычки намного эффективнее (и читабельны), чем делать «Одиночные кавычки вокруг текста и разбивка« $ VARS », как это» – technosaurus

+0

OK; возможно, вы должны были объяснить, к чему обращались. Я хотел бы видеть доказательства того, что двойные кавычки «намного эффективнее», чем одинарные кавычки. Одиночные кавычки на самом деле проще обрабатывать оболочку, но разница практически невелика, поэтому для большинства практических целей они будут одинаковыми. Я согласен с тем, что двойные кавычки являются «более читабельными» (и поэтому более эффективны при использовании времени программиста), особенно если вам нужно интерполировать переменные в строку. –