【问题标题】:Remove a character from the end of a variable从变量末尾删除一个字符
【发布时间】:2010-12-23 08:02:04
【问题描述】:

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

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    使用

    target=${1%/}
    

    reference

    【讨论】:

    • 它是POSIX,因此非常便携。
    • 请参阅Gilles answer 了解在保持根 (/) 安全的同时去除多个尾随 '/' 的简单方法:case $x in *[!/]*/) x=${x%"${x##*[!/]}"};; esac
    • 如果您必须将其与变量一起使用,例如DIR,那么它将是target=${DIR%/}
    • 链接失效(乌克兰)
    【解决方案2】:

    使用target=${1%/}

    请参阅此the parameter substitution of this bash scripting guide 了解更多信息。

    【讨论】:

      【解决方案3】:

      我认为规范化路径的更好解决方案是realpath $path-m 选项(如果不存在)。 此解决方案自动删除不必要的斜线并添加密码

      【讨论】:

      • realpath 可能不太便携:unix.stackexchange.com/questions/101080/…
      • realpath 是 GNU coreutils 的一部分,它实际上是在 linux 发行版中,在这种情况下,用户可能安装了不同的外部包,这可能会破坏可移植性
      • 并非每个发行版都包含 realpath。例如,我正在运行 Linux Mint 17(基于 Ubuntu),默认情况下它没有。它在存储库中,但不会自动安装。这就是我发布的链接所讨论的内容。
      • 针对指定用例的良好解决方案,尽管标记为正确的答案是最适合标题和最通用的答案。对我来说,我想从 URL 中删除尾部斜杠,这样就行不通了。关于您在这里的建议,我从经验中发现readlink -frealpath 更便携。对于附加/替代选项:linux.die.net/man/1/readlink
      • 这对我有用:target=$(realpath -L --relative-base . $1)
      【解决方案4】:

      小心,bash3 向 bash 添加了与 perl 类似的正则表达式。提到的指南涵盖了这一点以及 official guide at GNU ,但并非所有参考资料都如此。

      我做了什么?

      2.19/* 替换为2.19

      解决方案

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

      【讨论】:

      • 不起作用,斜线仍然存在(在变量的末尾,您的示例没有)。
      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2019-08-03
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多