从变量末尾删除字符


130

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

Answers:




13

我认为,更好的解决方案是对路径进行规范化realpath $path-m如果不存在,则可以选择。此解决方案自动删除不必要的斜杠并添加密码


realpath不太可能具有很高的可移植性:unix.stackexchange.com/questions/101080/…–
Matthew

realpath是GNU coreutils的一部分,它实际上是Linux发行版,在这种情况下,用户可能已安装了不同的外部软件包,这些软件包可能会破坏可移植性
amenzhinsky 2014年

2
并非每个发行版都包含realpath。例如,我正在运行Linux Mint 17(基于Ubuntu),默认情况下没有。它位于存储库中,但不会自动安装。这就是我发布的链接正在讨论的内容。
马修

尽管标记为正确的答案是标题和最通用的最佳答案,但对于指定用例而言,这是一个好的解决方案。对我来说,我想从URL删除尾部的斜杠,这样就行不通了。关于您在这里的建议,我从经验中发现,readlink -f它比更具可移植性realpath。对于其他/替代选项:linux.die.net/man/1/readlink
flungo 2015年

1
这对我target=$(realpath -L --relative-base . $1)
有用

3

注意,bash3向bash添加了与perl类似的正则表达式。提到的指南以及GNU正式指南都对此进行了介绍,但并非所有参考文献都涉及。

我做了什么

替代2.19/*2.19

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

不起作用,斜杠仍然存在(在变量的末尾,您的示例没有此斜杠)。
Zelphir Kaltstahl,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.