
似たようなルートを持っているとしましょう。
path_1=/this/is/a/path/with/slash/
次の情報を入手するにはどうすればよいですか?
/this/is/a/path/with/slash
したがって、パスには最後の「/」はありません。
答え1
すべてのPOSIXシェルには、man bash
「パラメータ拡張:一致するサフィックスパターンの削除」があります(参考文献を参照)。だから、使用
$ echo "${path_1%/}"
/this/is/a/path/with/slash
変数の値が次のような場合いいえスラッシュで終了すると、値は変更せずに出力されます。
答え2
あなたはそれを使用することができますrealpath
DIR=/tmp/foo///
echo "$(realpath -s "$DIR")"
# output: /tmp/foo
答え3
スラッシュを削除する別の方法は次のとおりです。
$ echo "$(dirname -- "$path")/$(basename -- "$path")"
私たちは2つの一般的なシェルコマンドdirname
とbasename
。
答え4
いくつかのオプションがあります。私は通常パスを正規化します。パスを正規化すると、デフォルトのパスが得られます。
たとえば、パスがフォルダへのリンクである場合、標準形式は実際のパスを取得します。また、UnixとLinuxでは一般的ではありませんが、許可されているすべての二重スラッシュを削除します。
~/lf
はいリンクだとします~/.hidden/food/limes/
。
PATHNAME=~/lf//price/
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" )"
echo "${CANONICAL_PATH}"
結果は次のとおりです。/home/kamil/.hidden/food/limes/price
これはファイル、ブロックデバイスなどに適用されますが、もちろん後ろにスラッシュはありません。たとえば、私のシステムでは次のようになります。
PATHNAME=/dev/disk/by-partlabel/Boot
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" )"
echo "${CANONICAL_PATH}"
明らかにする/dev/nvme0n1p2
パスがあるかどうかわからない場合は、いくつかのエラーチェックを追加する必要があります。
PATHNAME=~/lf//price/
CANONICAL_PATH="$( realpath --canonicalize-existing "${PATHNAME}" 2>/dev/null )"
if [[ -z ${CANONICAL_PATH} ]]
then
echo "Path doesn't exist: ${PATHNAME}" >&2
else
echo "Canonical path is ${CANONICAL_PATH}"
fi