Concaténation de variable d'environnement et append

0

Si j'ai une variable d'environnement:

$foo=/my/path/one:/my/path/two

Comment puis-je régler:

$bar=${foo}/bin

où:

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

?

Faire ce que j'ai fait ci-dessus ne fait que (ne manque pas de / bin sur le premier chemin):

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

Je peux le définir manuellement ou le parcourir dans une liste, mais cela semble compliqué sans raison. Existe-t-il une façon intelligente de procéder de la sorte en une ligne?

Enderland
la source

Réponses:

0

Est-ce que je vois bien que vous aimeriez avoir ceci:

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

?

Gombai Sándor
la source
0

Le plus robuste, mais peut-être le plus simple, consiste simplement à remplacer tous les deux-points à l' /bin:aide de l'extension de paramètre:

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

Explication:

La syntaxe ${foo}vous permet de rechercher et de remplacer de nombreux types dans la variable. Dans ce cas, nous utilisons une correspondance de modèle, les modèles étant séparés par des barres obliques. Normalement, vous pourriez faire quelque chose comme ça:

$(foo/findme/replace}

qui va chercher la chaîne findmedans $fooet le remplacer par replace.

Pour échanger les deux points avec x, vous pouvez rechercher avec ${foo/:/x/}mais pour tout remplacer et pas seulement le premier, vous mettez deux barres obliques au début. Pour utiliser une barre oblique dans le remplacement, vous devez y échapper avec une barre oblique inverse.\/

Tous ensemble, cela nous donne le modèle utilisé ci-dessus (espaces ajoutés pour plus de clarté mais ils le briseraient dans la vie réelle):

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

Le reste appartient à l'histoire.

Beroe
la source
Ce n'est pas facile pour un humain de lire: p, mais sed n'est pas mieux non plus.
Jiggunjer
Oui, les barres obliques sont déroutantes, mais // veut dire tout remplacer
beroe