Bash变量扩展

时间:2011-04-28 02:19:08

标签: bash variable-expansion

我有一个字符串,每个目录后面都有一个空格

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

以下代码删除字符串中的最后一个目录。

dirs=${dirs% * }

这适用于所有情况,除非字符串中只有一个目录,然后它不会删除它,因为它之前没有空格。
我确信有一种简单的方法可以解决这个问题,但是我被困住了 如果可能的话,我更喜欢没有if语句的单行方法。

感谢

4 个答案:

答案 0 :(得分:3)

$ 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 :(得分:1)

首先,从末尾删除任何非空格;然后,删除任何尾随空格:

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

答案 2 :(得分:0)

我相信有人会提供更好的东西,但是

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

答案 3 :(得分:0)

 $ 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]}