从变量末尾删除一个字符

139
Bash自动完成会在目录名后添加一个/。我如何从位置参数中去掉这个/?

Bash自动完成在目录名之后添加斜杠“/”符号。我该如何从位置参数中去除它?

#!/bin/sh

target=$1

function backup(){
  date=`date "+%y%m%d_%H%M%S"`
  PWD=`pwd`
  path=$PWD/$target
  tar czf /tmp/$date$target.tar.gz $path
}

backup
4个回答

250

9
它是POSIX,因此非常易于移植。 - go2null
3
请参考Gilles的回答,这是一种简单的方法,可以去除多个尾部的斜杠,同时确保根目录(/)不会被删除:case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac - go2null
1
如果你需要将其与变量一起使用,例如DIR,那么它应该是target=${DIR%/} - Brad Parks
一个链接已经失效(乌克兰)。 - Зелди

23

15

我认为更好的规范路径的解决方案是使用realpath $path命令,如果不存在则使用-m选项。这个解决方案会自动删除不必要的斜杠并添加当前目录路径。


realpath 不太可能非常可移植:http://unix.stackexchange.com/questions/101080/realpath-command-not-found - Matthew
realpath是GNU coreutils的一部分,它在Linux发行版中实际上是标配的。在这种情况下,用户可能已经安装了不同的外部软件包,这可能会破坏可移植性。 - amenzhinsky
2
并非每个发行版都包含 realpath。例如,我正在运行基于 Ubuntu 的 Linux Mint 17,它默认情况下没有安装它。它在软件仓库中,但不会自动安装。这就是我发布的链接所讨论的内容。 - Matthew
针对特定用例的好解决方案,尽管标记为正确答案的回答是标题和最通用的最佳答案。但对我来说,我想从URL中删除尾随斜杠,所以这个方法不适用。关于你在这里的建议,我的经验是readlink -frealpath更具可移植性。有关其他/替代选项:http://linux.die.net/man/1/readlink - flungo
2
这对我有用:target=$(realpath -L --relative-base . $1) - Mattia72

3

注意,bash3将perl-similar正则表达式添加到bash中。该指南涵盖了此内容以及GNU的官方指南,但并非所有参考资料都包括。

我做了什么?

2.19/*替换为2.19

解决方案

VER="2.19/foo-bar"
NEWVER=${VER%/*}

仍然不起作用,斜杠仍在那里(在变量末尾,您的示例中没有)。 - Zelphir Kaltstahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接