パラメータとしてディレクトリを必要とするスクリプトがあります。 2つの形式をサポートしたいと思います。 1つは次のとおりです。
a/b/c
(最後にスラッシュなし)他のものは次のとおりです。
a/b/c/
(最後にスラッシュ)。
私の質問:2つのフォームのいずれかが与えられたら、最初のフォームを変更せずに維持し、2番目のフォームから最後のスラッシュを削除して最初のフォームに変換するにはどうすればよいですか?
答え1
dir=${1%/}
スクリプトの最初の引数を取り、末尾のスラッシュ(存在する場合)を削除します。
答え2
末尾のスラッシュ(存在する場合)を削除するには、サフィックスの削除を使用できます。パラメータ拡張すべてのPOSIXスタイルシェルに存在する構文:
x=${x%/}
いくつかの合併症があります。これによりスラッシュのみが削除されるため、でa/b/c//
始まる場合はスラッシュが表示され続けます。また、元のパスがある場合は/
スラッシュを維持する必要があります。このような状況を処理するためのより複雑なソリューションは次のとおりです。
case $x in
*[!/]*/) x=${x%"${x##*[!/]}"};;
*[/]) x="/";;
esac
またはkshまたはbashからshopt -s extglob
:
[[ x = *[!/] ]] || x=${x%%*(/)}
ほとんどの場合、末尾のスラッシュは重要ではありません。引数がディレクトリへのシンボリックリンクである場合は重要です。末尾のスラッシュを持つ引数はディレクトリを指定し、末尾のスラッシュを持たない引数はシンボリックリンク自体を指定します。rsync
これは、末尾のスラッシュが存在するかどうかによってソースパラメータを異なる方法で処理するなど、他のいくつかのプログラムでも重要です。
答え3
realpath
与えられたパスを解決します。何よりも末尾のスラッシュを削除します。-s
次のSimlinkを防ぐために使用されます。
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a