我有一个字符串,每个目录后面都有一个空格
dirs="/home /home/a /home/b /home/a/b/c"
以下代码删除字符串中的最后一个目录。
dirs=${dirs% * }
这适用于所有情况,除非字符串中只有一个目录,然后它不会删除它,因为它之前没有空格。
我确信有一种简单的方法可以解决这个问题,但是我被困住了
如果可能的话,我更喜欢没有if语句的单行方法。
感谢
答案 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]}