Frage

Ich habe eine Zeichenfolge, die sich aus Verzeichnissen mit einem Raum nach jedem zusammensetzt

dirs="/home /home/a /home/b /home/a/b/c"

Der folgende Code löscht das letzte Verzeichnis in der Zeichenfolge.

dirs=${dirs% * }

Dies funktioniert in allen Fällen, außer wenn sich nur ein Verzeichnis in der Zeichenfolge befindet, und löscht es nicht, da es vor ihm keinen Platz hat.
Ich bin sicher, es gibt eine einfache Möglichkeit, dies zu beheben, aber ich stecke fest.
Ich würde eine Ein -Zeilen -Methode, wenn möglich, ohne Anweisungen bevorzugen.

Danke

War es hilfreich?

Lösung

$ 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"

Oder, wissen Sie, behalten Sie es einfach die ganze Zeit als Array.

$ dirs=(/home /home/a /home/b /home/a/b/c)
$ dirs=("${dirs[@]::$((${#dirs[@]}-1))}")
$ echo "${dirs[@]}"
/home /home/a /home/b

Andere Tipps

Löschen Sie zunächst alle Nichträume vom Ende; Löschen Sie dann alle nachverfolgenden Räume:

dirs="/home /home/a /home/b /home/a/b/c"
dirs="${dirs%"${dirs##*[[:space:]]}"}" && dirs="${dirs%"${dirs##*[![:space:]]}"}"
echo "$dirs"

Ich bin sicher, jemand wird etwas Besseres bieten, aber

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]}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top