espansione variabile bash
-
25-10-2019 - |
Domanda
Ho una stringa composta da directory con uno spazio dopo ognuno
dirs="/home /home/a /home/b /home/a/b/c"
il seguente codice elimina l'ultima directory nella stringa.
dirs=${dirs% * }
Questo funziona in tutti i casi tranne quando una sola directory è nella stringa, quindi non eliminarlo perché non dispone di uno spazio prima di esso.
Sono sicuro che c'è un modo semplice per risolvere questo problema, ma mi sono bloccato.
Preferirei un metodo di una riga senza if, se possibile.
grazie
Soluzione
$ dirs="/home /home/a /home/b /home/a/b/c"
$ dirsa=($dirs)
$ echo "${dirsa[@]::$((${#dirsa[@]}-1))}"
/home /home/a /home/b
$ dirs="${dirsa[@]::$((${#dirsa[@]}-1))}"
$ echo "$dirs"
/home /home/a /home/b
$ dirs="/home"
$ dirsa=($dirs)
$ dirs="${dirsa[@]::$((${#dirsa[@]}-1))}"
$ echo "$dirs"
In alternativa, si sa, basta tenerlo come una matrice per tutto il tempo.
$ dirs=(/home /home/a /home/b /home/a/b/c)
$ dirs=("${dirs[@]::$((${#dirs[@]}-1))}")
$ echo "${dirs[@]}"
/home /home/a /home/b
Altri suggerimenti
In primo luogo, eliminare eventuali non-spazi dalla fine; Quindi, eliminare eventuali spazi finali:
dirs="/home /home/a /home/b /home/a/b/c"
dirs="${dirs%"${dirs##*[[:space:]]}"}" && dirs="${dirs%"${dirs##*[![:space:]]}"}"
echo "$dirs"
Sono sicuro che qualcuno offrirà qualcosa di meglio, ma
case "$dirs" in (*" "*) dirs="${dirs% *}" ;; (*) dirs="" ;; esac
$ dirs="/home /home/a /home/b /home/a/b/c"
$ [[ $dirs =~ '(.*) (.[^ ]*)$' ]]
$ echo ${BASH_REMATCH[1]}
/home /home/a /home/b
$ dirs="/home"
[[ $dirs =~ '(.*) (.[^ ]*)$' ]]
$ echo ${BASH_REMATCH[1]}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow