Расширение переменной Bash
-
25-10-2019 - |
Вопрос
У меня есть строка, состоящая из каталогов с пространством после каждого
dirs="/home /home/a /home/b /home/a/b/c"
Следующий код удаляет последний каталог в строке.
dirs=${dirs% * }
Это работает во всех случаях, за исключением случаев, когда в строке находится только один каталог, то он не удаляет его, потому что у него нет места перед ним.
Я уверен, что есть простой способ исправить это, но я застрял.
Я бы предпочел метод одной строки без операторов, если это возможно.
Благодарность
Решение
$ 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"
Или, вы знаете, просто держите его как массив все время.
$ dirs=(/home /home/a /home/b /home/a/b/c)
$ dirs=("${dirs[@]::$((${#dirs[@]}-1))}")
$ echo "${dirs[@]}"
/home /home/a /home/b
Другие советы
Во-первых, удалите любые не пространства с конца; Затем удалите любые зацепленные пространства:
dirs="/home /home/a /home/b /home/a/b/c"
dirs="${dirs%"${dirs##*[[:space:]]}"}" && dirs="${dirs%"${dirs##*[![:space:]]}"}"
echo "$dirs"
Я уверен, что кто -то даст что -то лучше, но
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]}
Не связан с StackOverflow