Question

J'ai une chaîne composée de répertoires avec un espace après chaque

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

le code suivant supprime le dernier répertoire dans la chaîne.

dirs=${dirs% * }

Cela fonctionne dans tous les cas, sauf si un seul répertoire est dans la chaîne, il ne supprime pas parce qu'il ne dispose pas d'un espace avant.
Je suis sûr qu'il ya un moyen facile de résoudre ce problème, mais je suis coincé.
Je préfère une méthode d'une ligne sans instruction if si possible.

Merci

Était-ce utile?

La solution

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

Ou, vous le savez, il suffit de garder comme un tableau tout le temps.

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

Autres conseils

Tout d'abord, supprimer les espaces non de la fin; puis, supprimez tous les espaces de fin:

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

Je suis sûr que quelqu'un va offrir quelque chose de mieux, mais

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]}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top