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

$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

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

2 ответа2

0

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

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

?

0

Не самый надежный, но, пожалуй, самый простой способ - просто заменить все двоеточия на /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:  }

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .