Bash 스크립트에서 프로그램에 경로와 파일 이름을 전달합니다.

Bash 스크립트에서 프로그램에 경로와 파일 이름을 전달합니다.

저는 여러 개의 mp3를 하나로 병합하는 mp3wrap이라는 유틸리티를 사용합니다. "track 1.mp3", "track 2.mp3" 및 "track 3.mp3" 세 개의 파일이 포함된 "album 1" 디렉토리가 있다고 가정해 보겠습니다. 다음 명령을 실행하겠습니다.

mp3wrap album\ 1.mp3 album\ 1/*.mp3

"album 1" 디렉토리(두 번째 매개변수)에 있는 세 트랙을 모두 새 파일 "album 1.mp3"(첫 번째 매개변수)로 병합합니다.

나는 "Album 2", "Album 3" 등과 같은 많은 디렉토리를 가지고 있으며 프로세스를 자동화하는 스크립트를 작성하고 싶습니다. 나는 이것을 시도했습니다 :

for i in album*
do
  mp3wrap $i.mp3 $i/*.mp3
done  

그런데 오류가 났어요

1.mp3: No such file or directory

내 스크립트는 $i를 두 개의 개별 매개변수로 전달되는 "album 1.mp3"로 확장한 것으로 보입니다. 검색하고 읽은 후 다음과 같은 결과를 얻었습니다.

for i in album*
do
  mp3wrap "${i}.mp3" "${i}/*.mp3"
done  

이제 오류 메시지는 나타나지 않지만 mp3wrap 프로그램에서 "사용 중" 페이지가 나타납니다. 명령줄에서 명령을 실행할 때와 다르게 인수를 받는 것은 분명한데, bash 스크립트가 실행될 때 실제 명령줄이 어떻게 보이는지 확인하는 방법을 모르겠습니다.

내가 뭘 잘못했나요? 도움을 주시면 감사하겠습니다!

답변1

당신은 그것에 매우 가깝습니다. 올바른 코드는 다음과 같습니다.

for i in album*
do
    mp3wrap "${i}.mp3" "${i}"/*.mp3
done

첫 번째 문제를 방지하려면 변수와 매개변수를 거의 항상 인용해야 합니다. 대조적으로, 쉘 글로빙 문자는 비슷 *하지만 ?그렇게 해서는 안 됩니다. 그렇지 않으면 특별한 의미를 잃습니다.

관련 정보