web-dev-qa-db-ja.com

各パラメーターから末尾のスラッシュを削除する最も簡単な方法は何ですか?

'$ @'配列の各パラメーターから末尾のスラッシュを削除して、rsyncが名前でディレクトリをコピーする最も簡単な方法は何ですか?

rsync -a --exclude='*~' "$@" "$dir"

明確にするためにタイトルが変更されました。コメントを理解し、複数の後続スラッシュに関する回答を得るには、編集履歴を参照してください。

66
sid_com

詳細な${parameter%Word}拡張を使用できます here 。動作を示す簡単なテストスクリプトを次に示します。

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}
117
Sean Bright

受け入れられた回答は、末尾のスラッシュを1つ削除します。

複数の末尾のスラッシュを削除する方法の1つは次のとおりです。

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

どの出力:

/looks/like/a/path/// /looks/like/a/path
21
Chris Johnson

これは私のために働く:${VAR%%+(/)}

ここで説明されているように http://wiki.bash-hackers.org/syntax/pattern

シェルオプションextglobを設定する必要がある場合があります。私はそれが有効になっているのを見ることができませんが、それはまだ動作します

17
Ivan

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

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
7
czerny

zshでは、:a修飾子を使用できます。

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

これはrealpathのように機能しますが、引数としてファイル/ディレクトリが欠落しても失敗しません。

4

参考までに、SOで見つかった回答に基づいて、これら2つの関数を.bash_profileに追加しました。クリス・ジョンソンが言ったように、${x%/}を使用するすべての答えはスラッシュを1つだけ削除します。これらの関数は、彼らが言うことをします。

rem_trailing_slash() {
    echo $1 | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo $(rem_trailing_slash $1)/
}
1
Sheljohn