Конкатенация и добавление переменных окружения

Конкатенация и добавление переменных окружения

Если у меня есть переменная окружения:

$foo=/my/path/one:/my/path/two

Как мне установить:

$bar=${foo}/bin

где:

$bar=/my/path/one/bin:/my/path/two/bin

?

Выполнение того, что я сделал выше, приводит только к (не отсутствию /bin на первом пути):

$bar=/my/path/one/:/my/path/two/bin

Я могу вручную задать это или перебрать в списке, но это кажется сложным без причины. Есть ли умный однострочный способ сделать это?

решение1

Правильно ли я понимаю, что вам хотелось бы иметь это:

foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo

?

решение2

Не самый надежный, но, возможно, самый простой способ — просто заменить все двоеточия с /bin:помощью расширения параметров:

foo=/my/path/one:/my/path/two:/my/path/three

noo=${foo//:/\/bin:}/bin

echo $noo
/my/path/one/bin:/my/path/two/bin:/my/path/three/bin

Объяснение:

Синтаксис ${foo}позволяет выполнять много видов поиска и замены в переменной. В этом случае мы используем сопоставление с шаблоном, разделяя шаблоны косыми чертами. Обычно вы можете сделать что-то вроде этого:

$(foo/findme/replace}

который будет искать строку и заменять ее findmeна .$fooreplace

Чтобы заменить двоеточия на x, вы можете выполнить поиск с помощью , ${foo/:/x/}но чтобы заменить все, а не только первое, вы ставите два слеша в начале. Чтобы использовать слеш в замене, вам нужно экранировать его с помощью обратного слеша\/

В совокупности это дает нам шаблон, использованный выше (пробелы добавлены для ясности, но в реальной жизни они бы его нарушили):

          <find>   <replace>
${foo  //   :   /   \/bin:  }

Остальное уже история.

Связанный контент