1

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

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

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

dirs=${dirs% * }

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

谢谢

4

4 回答 4

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
于 2011-04-28T02:29:11.577 回答
1

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

dirs="/home /home/a /home/b /home/a/b/c"
dirs="${dirs%"${dirs##*[[:space:]]}"}" && dirs="${dirs%"${dirs##*[![:space:]]}"}"
echo "$dirs"
于 2011-04-28T07:29:18.450 回答
0

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

case "$dirs" in (*" "*) dirs="${dirs% *}" ;; (*) dirs="" ;; esac
于 2011-04-28T02:34:13.793 回答
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]}
于 2011-04-28T02:47:02.267 回答