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

sid*_*com 68 bash shell rsync arguments stripslashes

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

rsync -a --exclude='*~' "$@" "$dir"
Run Code Online (Sandbox Code Playgroud)

标题已更改以澄清.要了解有关多个尾部斜杠的注释和答案,请参阅编辑历史记录.

Sea*_*ght 119

您可以使用此处${parameter%word}详述的扩展.这是一个演示行为的简单测试脚本:

#!/bin/bash

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

echo ${@%/}
Run Code Online (Sandbox Code Playgroud)

  • +1:要高度迂腐,这将删除单个斜杠,而不是所有尾部斜杠.删除任意数量的斜杠:`shopt -s extglob; echo"$ {@ %% +(/)}"` (29认同)
  • 警告:您可能不希望在所有情况下删除尾部斜杠.如果提供"/"作为参数,删除尾部斜杠将会产生......不幸的后果. (23认同)
  • PROTIP:将`tr -s /`与变量regex组合以删除重复的斜杠然后删除尾部斜杠.例如`DIR = $(echo // some /// badly/written /// dir ////// | tr -s /); DIR = $ {DIR%/}` (11认同)

Chr*_*son 23

接受的答案将削减一个尾随斜线.

修剪多个尾部斜杠的一种方法是这样的:

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

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

echo $VALUE $TRIMMED
Run Code Online (Sandbox Code Playgroud)

哪个输出:

/looks/like/a/path/// /looks/like/a/path
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这在`$()` 结构中是不必要的。然而它也是无害的 :) 所以使用像 `"$VALUE"` 这样的双引号可能是一个好习惯,这样你就不必决定何时使用双引号,何时不使用双引号。 (2认同)

小智 18

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

http://wiki.bash-hackers.org/syntax/pattern所述

可能需要设置shell选项extglob.我看不到它为我启用但它仍然有效

  • 查询设置:`shopt extglob`没有选项 (2认同)
  • 这是扩展模式语言,您**必须**设置`extglob`。 (2认同)
  • 这在 Mac OS X 的内置 bash 上不起作用。上面 Sean Bright 的解决方案是:“${VAR%/}” (2认同)

She*_*ohn 10

仅供参考,我.bash_profile根据在 SO 上找到的答案将这两个函数添加到我的。正如 Chris Johnson 所说,所有使用的答案${x%/}都只删除一个斜杠,这些函数会按照他们所说的去做,希望这有用。

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

force_trailing_slash() {
    echo "$(rem_trailing_slash "$1")/"
}
Run Code Online (Sandbox Code Playgroud)


cze*_*rny 8

realpath解决了给定的路径.除此之外,它还删除了尾部斜杠.使用-s防止以下simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Run Code Online (Sandbox Code Playgroud)

  • 它要求路径中除最后一个节点之外的所有节点都存在。如果用户输入一些不存在的路径,“realpath”将会失败。 (3认同)
  • @Livy `realpath --canonicalize-missing` 对于路径中任何不存在的部分绝对正确 (3认同)

Nic*_*ich 6

zsh中您可以使用:a修饰符。

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

echo "${DIRECTORY:a}"

=> /some/path/name
Run Code Online (Sandbox Code Playgroud)

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