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

È stato utile?

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
scroll top