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

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

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

dirs=${dirs% * }

在所有情况下,这都可以使用,除非仅有一个目录在字符串中,否则它不会删除它,因为它没有前面的空间。
我敢肯定,有一种简单的方法可以解决此问题,但是我被困了。
如果可能的话,我更喜欢一个无if语句的一行方法。

谢谢

有帮助吗?

解决方案

$ 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]}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top