#!/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
将遍历与*.flac
glob 匹配的每个文件。
由于每个条目都是一个文件(并且我假设文件名中没有空格),因此将是和foo.flac
的扩展。$a
${a[@]}
该结构${var/%foo/bar}
将替换变量末尾的foo
with 。因此,它将扩展名替换为示例中的扩展名,以提供输出文件名。bar
var
flac
mp3
ffmpeg