Расширение переменной Bash - PullRequest
1 голос
/ 28 апреля 2011

У меня есть строка, состоящая из каталогов с пробелом после каждого

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

, следующий код удаляет последний каталог в строке.

dirs=${dirs% * }

Это работает во всех случаях, кроме случаев, когда в строке присутствует только один каталог, и он не удаляется, потому что перед ним нет пробела.
Я уверен, что естьпростой способ исправить это, но я застрял.
Я бы предпочел однострочный метод без операторов if, если это возможно.

спасибо

Ответы [ 4 ]

3 голосов
/ 28 апреля 2011
$ 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
1 голос
/ 28 апреля 2011

Сначала удалите все пробелы с конца; затем удалите все завершающие пробелы:

dirs="/home /home/a /home/b /home/a/b/c"
dirs="${dirs%"${dirs##*[[:space:]]}"}" && dirs="${dirs%"${dirs##*[![:space:]]}"}"
echo "$dirs"
0 голосов
/ 28 апреля 2011
 $ 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]}
0 голосов
/ 28 апреля 2011

Я уверен, что кто-то предоставит что-то лучше, но

case "$dirs" in (*" "*) dirs="${dirs% *}" ;; (*) dirs="" ;; esac
...