【发布时间】: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); done和time for ((i=0; i<100; i++)); do file=${file##*/}; file=${file%.class}; done。我测量 100basenames 需要半秒以上,而 PE 循环的完成时间不到 1/100 秒。
标签: bash substitution