
Se eu tiver uma variável de ambiente:
$foo=/my/path/one:/my/path/two
Como posso definir:
$bar=${foo}/bin
onde:
$bar=/my/path/one/bin:/my/path/two/bin
?
Fazer o que fiz acima apenas faz (não falta /bin no primeiro caminho):
$bar=/my/path/one/:/my/path/two/bin
Posso definir isso manualmente ou iterá-lo em uma lista, mas isso parece complicado sem motivo. Existe uma maneira inteligente de fazer isso?
Responder1
Vejo certo que você gostaria de ter isto:
foo=$(echo $foo | sed -e 's@:\|$@/bin&@g'); echo $foo
?
Responder2
Não é o mais robusto, mas talvez o mais simples é apenas substituir todos os dois pontos pelo /bin:
uso da expansão de parâmetros:
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
Explicação:
A sintaxe ${foo}
permite fazer vários tipos de pesquisa e substituição na variável. Neste caso estamos usando correspondência de padrões, com os padrões separados por barras. Normalmente você pode fazer algo assim:
$(foo/findme/replace}
que procurará a string e a findme
substituirá $foo
por replace
.
Para trocar os dois pontos por x
, você poderia pesquisar com, ${foo/:/x/}
mas para substituir todos e não apenas o primeiro, você coloca duas barras no início. Para usar uma barra na substituição você precisa escapá-la com uma barra invertida\/
Todos juntos, isso nos dá o padrão usado acima (espaços adicionados para maior clareza, mas eles quebrariam na vida real):
<find> <replace>
${foo // : / \/bin: }
O resto é história.