読者です 読者をやめる 読者になる 読者になる

PATHから特定のパスを抜く

bash
echo "orig="$PATH
IFS=':' read -a pathes <<< "$PATH"
declare -a tmp_pathes
for path in "${pathes[@]}"
do
  if [ "$path" != "$HOME/.plenv/bin" ]; then
    tmp_pathes=("${tmp_pathes[@]}" "$path")
  fi
done
TMP_PATH=$(printf ":%s" "${tmp_pathes[@]}")
PATH=${TMP_PATH:1:${#TMP_PATH}}

echo "after="$PATH
split
IFS=':' read -a pathes <<< "$PATH"

IFS変数と 'read -a'を使って, 文字列を IFSに指定した文字で分割した
配列変数に格納することができる.

join
TMP_PATH=$(printf ":%s" "${tmp_pathes[@]}")
PATH=${TMP_PATH:1:${#TMP_PATH}}

配列変数の前に joinしたい文字を置き %sとすると(ここでは :%s)とすると
配列の要素がその文字で区切られたものが表示される. ただし一番先頭にも
その区切り文字が現れてしまうので, それは次の行の部分文字列記法により
削除する.

結果

% bash test.sh
orig=/home/syohei/.plenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
after=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

おわりに

文字列置換だけでうまくいけばよかったのだが, 少し試したところ
うまくいかなかったのでこのような方法を取ってしまった.
bashの文字列置換をもっと知る必要がある.