bash中的“ $ {file%。*}”是什么意思

时间:2019-04-29 01:01:05

标签: bash git-bash

我正在阅读Using bash, how can I remove the extensions of all files in a specific directory?。可接受的答案是:

for file in "$path"/*; do
    [ -f "$file" ] || continue
    mv "$file" "${file%.*}"
done

我不明白这行:

    mv "$file" "${file%.*}"

尽管阅读了许多资源,例如http://mywiki.wooledge.org/BashGuide/Patterns

这是怎么回事?

2 个答案:

答案 0 :(得分:1)

查看parameter substitution的文档

  

${var%Pattern}, ${var%%Pattern}

     

${var%Pattern} $var中删除$Pattern中最短的部分   匹配$var的后端。

     

${var%%Pattern} $var中删除$Pattern中最长的部分   匹配$var的后端。

基本上是要用完整的文件名填充$file,然后删除%中最短匹配项.*之后的所有内容,该扩展名可以是任意扩展名。

# assume you want to convert myfile.txt to myfile
$file="myfile.txt"
# move the current name to the current name excluding the shortest match of .* = .txt
mv "$file" "${file%.*}"
# expands to
mv "myfile.txt" "myfile"

答案 1 :(得分:0)

这是Parameter Expansion的一种形式。

"${file%.*}"的意思是“变量file减去最右边的句号之后的所有内容”。 ${file%%.*}"将引用最左侧期间。

这是${%}运算符和Glob的组合。

edit:在进行“子字符串删除”扩展时,我遇到了麻烦,直到我注意到#位于$的“左侧”,而%位于右侧。在使用Bash作为脚本语言时,参数扩展是必不可少的组成部分。我建议练习。