从每个参数中删除尾部斜杠的最简单方法是什么?

从“ $@”数组中的每个参数中删除尾部斜杠以便 rsync按名称复制目录的最简单方法是什么?

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

标题已经更改以便澄清。要理解有关多个尾部斜杠的注释和答案,请查看编辑历史记录。

111329 次浏览

您可以使用详细的 给你${parameter%word}扩展。下面是一个简单的测试脚本,它演示了这种行为:

#!/bin/bash


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


echo ${@%/}

这个对我有用: ${VAR%%+(/)}

正如这里描述的 http://wiki.bash-hackers.org/syntax/pattern

可能需要设置 shell 选项 extglobb。我不能看到它为我启用,但它仍然工作

接受的答案将削减一个结尾斜杠。

一种修剪多个斜线的方法是这样的:

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


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


echo "$VALUE" "$TRIMMED"

产出:

/looks/like/a/path/// /looks/like/a/path

中可以使用 :a修饰符。

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


echo "${DIRECTORY:a}"


=> /some/path/name

这与 realpath类似,但不会因为缺少文件/目录作为参数而失败。

仅供参考,我根据在 SO 上找到的答案将这两个函数添加到我的 .bash_profile中。正如克里斯约翰逊所说,所有的答案使用 ${x%/}删除只有一个斜杠,这些函数将做什么,他们说,希望这是有用的。

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


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

realpath解析给定的路径。除其他外,它还删除了尾部斜杠。使用 -s可以防止下面的模拟链接

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

不是最漂亮的方法,但是又快又简单。

我只需要添加一个斜线并删除所有的双精度模式。假设这样的模式在其他地方找不到。

WORD="abc/"
WORD=$WORD'/'
WORD=`echo $WORD | sed s/'\/\/'/''/g`
echo $WORD

注意到已接受答复中的一些意见:

  1. 用单斜杠 /替换所有重复的斜杠 //[...](每@Dave 注释)
  2. 删除尾部斜杠,除非它也是前面的斜杠(例如,根文件路径 /)(每@GordonDavisson 注释)
trimSlash() { for s; do sed -E 's://*:/:g; s:(^/)?/*$:\1:' <<< "${s}"; done; }

虽然没有使用参数替换的答案那么简洁,但是我认为这是值得努力的。

一些测试案例:

$ trimSlash "/" "///" "a/" "a/a/" "a///a/" "a/a" "a///a" "a///" "/a/a/" "///a///"
/
/
a
a/a
a/a
a/a
a/a
a
/a/a
/a

我曾经使用过的方法,在修剪目录参数时,这里使用 dirnamebasename来分割路径,然后重新组合这些部分,而不使用后面的斜杠。

raw_dir=/a/b/c/
trim_dir=$(dirname "$raw_dir")"/"$(basename "$raw_dir")