이 스크립트의 역할은 정확히 무엇입니까? [복사]

이 스크립트의 역할은 정확히 무엇입니까? [복사]
#!/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

관련 정보