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