このスクリプトの役割は正確に何ですか? [コピー]

このスクリプトの役割は正確に何ですか? [コピー]
#!/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

推測できるように、値の${var/%flac/mp3}終わり"flac"(ある場合)を$varに置き換えます"mp3""${var[@]/%flac/mp3}"同じことをする${var[@]}ifの出力要素varは配列です。

ここではa配列ではないので削除できます。[@](これは以前のプログラマーの試みの遺産だと思います。)

答え2

これは単純なシェル拡張を作成します。この変数はglobと一致するすべてのファイルをa繰り返します*.flac

各項目はファイルなので(ファイル名にスペースがないと仮定)、これは拡張子のfoo.flac拡張になります。$a${a[@]}

この構造は変数の末尾のをに${var/%foo/bar}置き換えます。fooしたがって、拡張子を例の拡張子に置き換えて、出力ファイル名を提供します。barvarflacmp3ffmpeg

関連情報