
Если у меня есть переменная окружения:
$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
на .$foo
replace
Чтобы заменить двоеточия на x
, вы можете выполнить поиск с помощью , ${foo/:/x/}
но чтобы заменить все, а не только первое, вы ставите два слеша в начале. Чтобы использовать слеш в замене, вам нужно экранировать его с помощью обратного слеша\/
В совокупности это дает нам шаблон, использованный выше (пробелы добавлены для ясности, но в реальной жизни они бы его нарушили):
<find> <replace>
${foo // : / \/bin: }
Остальное уже история.