这个脚本到底做了什么?

这个脚本到底做了什么?
#!/bin/bash

for a in ./*.flac; do
  ffmpeg -i "$a" -qscale:a 0 "${a[@]/%flac/mp3}"
done

前几天发现这个脚本可以将当前目录下的所有FLAC文件转换成MP3格式。

我不明白的是这里的"${a[@]/%flac/mp3}"部​​分。我认为它会将当前文件名的结尾 flac 替换为 mp3。但这[@]部分到底有什么作用呢?是正则表达式吗?

答案1

正如您所猜测的,将 value 的${var/%flac/mp3}结尾"flac"(如果有)替换$var"mp3""${var[@]/%flac/mp3}"会做同样的事情每个${var[@]}if输出的元素var是一个数组。

在这里,由于a不是数组,因此您可以删除[@](我认为这是程序员以前尝试的遗产)。

答案2

这做了一个简单的 shell 扩展。该变量a将遍历与*.flacglob 匹配的每个文件。

由于每个条目都是一个文件(并且我假设文件名中没有空格),因此将是和foo.flac的扩展。$a${a[@]}

该结构${var/%foo/bar}将替换变量末尾的foowith 。因此,它将扩展名替换为示例中的扩展名,以提供输出文件名。barvarflacmp3ffmpeg

相关内容