ディレクトリパスの最後のスラッシュを取り除く方法は?


16

1つの引数としてディレクトリを必要とするスクリプトがあります。2つの形式をサポートしたい:1つは

a/b/c

(最後にスラッシュはありません)そして別のものは

 a/b/c/

(最後にスラッシュがあります)。

私の質問:2つの形式のいずれかが与えられた場合、最初の形式を変更せずに保持し、2番目の形式の最後のスラッシュを削除して最初の形式に変換する方法を教えてください。


2
大した問題ではないということではありません-最初以外の場所にあるダブルスラッシュは、単一のスラッシュと同等/です。
ムル

@muru私はこれを前に知りませんでした:)。
裕隆青


1
@muru末尾のスラッシュは、シンボリックリンクの動作とそれが指すディレクトリの動作の違い、またはのソース引数などの違いを生む可能性がありrsyncます。
ジル「SO-悪であるのをやめる」

@Gillesは確かですが、ご覧のとおり、私はパスに参加することについて話しているのです。
ムル

回答:



11

末尾のスラッシュがある場合は削除するために、すべてのPOSIXスタイルのシェルにある接尾辞削除パラメーター拡張構成を使用できます。

x=${x%/}

いくつかの問題があります。これにより、スラッシュが1つだけ削除されるため、最初にスラッシュを削除した場合a/b/c//でも、スラッシュが残ります。さらに、元のパスがの場合/、スラッシュを保持する必要があります。これらのケースを処理するより複雑なソリューションを次に示します。

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

または、ksh、またはbashの後shopt -s extglob

[[ x = *[!/] ]] || x=${x%%*(/)}

多くの場合、末尾にスラッシュがあっても問題ないことに注意してください。引数がディレクトリへのシンボリックリンクであるかどうかは問題になりません。末尾のスラッシュがある場合、引数はディレクトリを指定しますが、末尾のスラッシュがない場合、引数はシンボリックリンク自体を指定します。また、他のいくつかのプログラムでも重要です。たとえば、のソース引数rsyncは、末尾のスラッシュの有無によって異なる方法で処理されます。


1

realpath指定されたパスを解決します。とりわけ、後続のスラッシュも削除します。-s次のsimlinkを防ぐために使用します

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.