【问题标题】:How to use bash parameter substitution to remove "./"?如何使用 bash 参数替换来删除“./”?
【发布时间】:2021-04-09 05:21:59
【问题描述】:

我正在编写一个 bash 脚本来更改字符串

./FirstJavaProgram.class

FirstJavaProgram

我想出了这个脚本。但是 bash 抱怨第 4 行替换不好。

#!/bin/sh
file=${1%%.class}
echo $file
file=${file/.\//}

我应该如何写出正确的语法?

【问题讨论】:

  • file="${file/.\//}" 你可以用file="./FirstJavaProgram.class"; echo "${file/.\//}" 向自己证明这一点(注意:因为你没有替换任何东西,"${file/.\/}" -- 假设结束'/')也在bash中@987654328 @ 也会这样做。
  • 您也可以使用"${file#*/}" 如果您的字符串在脚本之外,则根本不需要脚本,例如echo "./FirstJavaProgram.class" | sed 's|^[.]/||'
  • @drdot : basename "$file" .class
  • #!/bin/sh 不使用 bash 运行您的脚本。 sh 是一种不同的语言,功能较少(包括可用的 PE 语法较少)。使用 #!/usr/bin/env bash 使用通过 PATH 查找找到的 bash 副本,或使用 #!/bin/bash 使用来自 /bin 的 bash 副本,如果您确定那是您想要的。
  • @user1934428, ...启动外部程序 basename 运行速度比 OP 要求的内置外壳 PE 方法慢得多。比较 time for ((i=0; i<100; i++)); do file=$(basename "$file" .class); donetime for ((i=0; i<100; i++)); do file=${file##*/}; file=${file%.class}; done。我测量 100 basenames 需要半秒以上,而 PE 循环的完成时间不到 1/100 秒。

标签: bash substitution


【解决方案1】:

${var//search/replace}bash 独有的功能。不保证与/bin/sh 一起出现。请改用${var#prefix},它是POSIX sh 规范的一部分,因此保证由/bin/sh 提供。

#!/bin/sh
file=${1%.class}
echo "Trimmed suffix:      $file"
file=${file#./}
echo "Also trimmed prefix: $file"

...如果参数为./FirstJavaProgram.class,则输出为:

Trimmed suffix:      ./FirstJavaProgram
Also trimmed prefix: FirstJavaProgram

相比之下,如果您想使用仅限 bash 的功能,请酌情以 #!/usr/bin/bash#!/bin/bash#!/usr/bin/env bash 等开头。

【讨论】:

    【解决方案2】:

    试试这个命令: echo "./FirstJavaProgram.class" | sed 's\[.]/\\'

    您的脚本应如下所示:

    #!/bin/sh
    file=./FirstJavaProgram.class
    echo $file 
    echo $file | sed 's\[.]/\\'
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2013-02-17
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多