シェルスクリプトでパスの連結


シェルスクリプトで、あるファイルパスに別の相対ファイルパスを連結して新しいファイルパスを得るには次のようにします。

前提

  • ベースとなるパス base は空文字列ではない
  • 連結するパス rel は空文字列ではなく、かつスラッシュで始まらない

コード

"${base%/}/${rel}"

解説

結果が単語分割されるを避けるため、全体を二重引用符で囲みます。

${base%/} で、 base の末尾にスラッシュがある場合にはそれを(一つ)消します。これにより base がスラッシュのみからなるパスである場合でもスラッシュの数が変わることを防ぎます。例えば base/relhome ならば結果は /home になります。

ここでもし "${base}/${rel}" を使ったとしたら、結果は //home になります。Cygwin などの環境ではスラッシュ二つが特別な意味を持つため、これは正しい結果ではありません。