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