1

各ディレクトリの後にスペースがあるディレクトリで構成される文字列があります

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

次のコードは、文字列の最後のディレクトリを削除します。

dirs=${dirs% * }

これは、文字列内にディレクトリが 1 つしかない場合を除き、すべての場合に機能します。その場合、その前にスペースがないため削除されません。
これを修正する簡単な方法があると確信していますが、行き詰まっています。
可能であれば、if ステートメントを使用しない 1 行の方法をお勧めします。

ありがとう

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
 $ 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 に答える
0

きっと誰かがもっと良いものを提供してくれるでしょうが、

case "$dirs" in (*" "*) dirs="${dirs% *}" ;; (*) dirs="" ;; esac
于 2011-04-28T02:34:13.793 に答える