O più in generale, come rimuovo un elemento da un elenco separato da due punti in una variabile d'ambiente Bash?
Pensavo di aver visto un modo semplice per farlo anni fa, utilizzando le forme più avanzate di espansione delle variabili Bash, ma se è così ne ho perso traccia. Una rapida ricerca su Google ha portato sorprendentemente pochi risultati rilevanti e nessuno che io definirei "semplice" o "elegante". Ad esempio, due metodi che utilizzano rispettivamente sed e 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)
Non esiste niente di semplice? C'è qualcosa di analogo a una funzione split () in Bash?
Aggiornamento:
sembra che debba scusarmi per la mia domanda volutamente vaga; Ero meno interessato a risolvere un caso d'uso specifico che a provocare una buona discussione. Fortunatamente, ho capito!
Ci sono alcune tecniche molto intelligenti qui. Alla fine, ho aggiunto le seguenti tre funzioni alla mia cassetta degli attrezzi. La magia avviene in path_remove, che si basa in gran parte sull'uso intelligente della awk
variabile RS di Martin York .
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/:$//'`; }
L'unico vero problema è l'uso di sed
per rimuovere i due punti finali. Considerando quanto sia semplice il resto della soluzione di Martin, però, sono abbastanza disposto a conviverci!
Domanda correlata: Come si manipolano gli elementi $ PATH negli script della shell?
WORK=`echo -n ${1} | awk -v RS=: -v ORS=: '$0 != "'${3}'"' | sed 's/:$//'`; eval "export ${2}=${WORK}"
ma devi chiamarla comefunc $VAR VAR pattern
(basato su @ martin-york e @ andrew-aylett)