Или, в более общем плане, как мне удалить элемент из списка, разделенного двоеточиями, в переменной среды Bash?
Я думал, что видел простой способ сделать это много лет назад, используя более продвинутые формы расширения переменных Bash, но в таком случае я потерял его из виду. Быстрый поиск в Google дал на удивление мало релевантных результатов, и ни один из них я бы не назвал «простым» или «элегантным». Например, два метода с использованием sed и awk соответственно:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH)
Нет ничего простого? Есть ли что-нибудь аналогичное функции split () в Bash?
Обновление:
похоже, мне нужно извиниться за мой намеренно расплывчатый вопрос; Меня меньше интересовало решение конкретного варианта использования, чем спровоцировать хорошее обсуждение. К счастью, я понял!
Здесь есть несколько очень умных приемов. В конце концов, я добавил в свой набор инструментов следующие три функции. Магия происходит в path_remove, который во многом основан на умном использовании Мартином Йорком awk
переменной RS.
path_append () { path_remove $1; export PATH="$PATH:$1"; }
path_prepend () { path_remove $1; export PATH="$1:$PATH"; }
path_remove () { export PATH=`echo -n $PATH | awk -v RS=: -v ORS=: '$0 != "'$1'"' | sed 's/:$//'`; }
Единственная реальная проблема здесь - это использование sed
для удаления конечной двоеточия. Однако, учитывая, насколько проста остальная часть решения Мартина, я вполне готов смириться с этим!
Связанный вопрос: Как управлять элементами $ PATH в сценариях оболочки?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
но вы должны называть ееfunc $VAR VAR pattern
(на основе @ martin-york и @ andrew-aylett)