環境変数の連結と追加

環境変数の連結と追加

環境変数がある場合:

$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

これを手動で設定したり、リスト内で反復処理したりすることもできますが、これらは理由もなく複雑に思えます。これをワンライナーで実行できる賢い方法はありますか?

答え1

次のようなものをご希望でしょうか:

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

?

答え2

最も堅牢ではありませんが、おそらく最も単純なのは、/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/}が、最初の文字だけでなくすべてを置換するには、先頭に2つのスラッシュを入れます。置換でスラッシュを使用するには、バックスラッシュでエスケープする必要があります。\/

これらをすべて合わせると、上で使用したパターンが得られます (わかりやすくするためにスペースが追加されていますが、実際にはスペースがあるとパターンが崩れます)。

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

その後は歴史が語っています。

関連情報