Bashシェルのパスから最後の "/"を削除する方法は?

Bashシェルのパスから最後の "/"を削除する方法は?

似たようなルートを持っているとしましょう。

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つの一般的なシェルコマンドdirnamebasename

答え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

関連情報