質問
私はそれぞれの後にスペースを持つディレクトリで構成された文字列を持っています
dirs="/home /home/a /home/b /home/a/b/c"
次のコードは、文字列の最後のディレクトリを削除します。
dirs=${dirs% * }
これは、1つのディレクトリのみが文字列にある場合を除き、すべての場合に機能しますが、その前にスペースがないため削除しません。
これを修正する簡単な方法があると確信していますが、私は立ち往生しています。
可能であれば、声明のない場合は1行の方法を好みます。
ありがとう
解決
$ 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]}
所属していません StackOverflow