Concatenação da variável de ambiente e anexação

0

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 eu fiz acima só faz (não falta / bin no primeiro caminho):

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

Eu posso definir isso manualmente ou iterar em uma lista, mas eles parecem complicados sem nenhum motivo. Existe uma maneira inteligente de fazer isso?

    
por enderland 15.02.2016 / 20:40

2 respostas

0

Eu vejo bem que você gostaria de ter isto:

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

?

    
por 15.02.2016 / 21:15
0

Não o mais robusto, mas talvez o mais simples é simplesmente substituir todos os dois-pontos por /bin: usando a expansão de parâmetro:

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 findme em $foo e substituirá por replace .

Para trocar os dois-pontos com x , você pode procurar 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 escapar com barra invertida \/

Todos juntos, isso nos dá o padrão usado acima (espaços adicionados para clareza, mas eles quebrariam na vida real):

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

O resto é história.

    
por 16.02.2016 / 00:26

Tags