l'expansion Bash variable
-
25-10-2019 - |
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
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