Concatenação e acréscimo de variáveis ​​de ambiente

Concatenação e acréscimo de variáveis ​​de ambiente

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 findmesubstituirá $foopor 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.

informação relacionada