ZSH 루프에 매개변수를 추가한 다음 이를 명령에 전달하는 방법은 무엇입니까?

ZSH 루프에 매개변수를 추가한 다음 이를 명령에 전달하는 방법은 무엇입니까?

를 사용하여 mkvmerge이렇게 배열된 여러 MKV 클립에 오디오 트랙을 추가하고 싶습니다.

Clips_folder
/spa/clip1.mka
/spa/clip2.mka
/ger/clip1.mka
/ger/clip2.mka
/clip1.mkv
/clip2.mkv

이것은 내 스크립트입니다("매개변수 목록에 매개변수 추가"에 따라):

#!/bin/zsh

mkdir -p output

for video in *.mkv
do
    audioargs=("-o ./output/${video} --language 0:eng ${video}")
    for audiodir in *(/)
        do
            audioargs+=("--language 0:${audiodir} ./${audiodir}/${video:r}.mka")
        done
    echo ${audioargs[@]}
done

출력은 다음과 같습니다.

-o ./output/clip1.mkv --language 0:eng clip1.mkv --language 0:spa ./spa/clip1.mka --language 0:ger ./ger/clip1.mka

하지만 내가 그것을 바꾸면 mkvmerge ${audioargs[@]}나는 얻는다.

mkvmerge v45.0.0 ('Heaven in Pennies') 64-bit
Error: no destination file name was given

등 으로 확장되도록 올바르게 audioargs전달 하려면 어떻게 해야 합니까 ?mkvmergemkvmerge -o file --language ...

답변1

테스트 할 필요는 없었지만 mkvmerge배열을 구축할 때 내용을 참조하는 방법에 문제가 있다는 것은 확실합니다. 당신이 뭔가를 할 때

audioargs=("-o ./output/${video} --language 0:eng ${video}")

큰따옴표는 전체 내용을 하나의 긴 문자열로 처리하도록 쉘에 지시하므로 배열에 단일 요소로 저장되므로 mkvmerge일련의 인수가 아닌 공백을 포함하는 단일 인수로 전달됩니다.

echo매개변수 내의 공백과 공백의 차이는 숨겨집니다 .~ 사이그러한 것들에 대해 매우 오해를 불러일으키는 논쟁. set -x명령 앞에 이를 놓으면 실제로 무슨 일이 일어나고 있는지 명확하게 알 수 있습니다. 예제 파일 이름을 사용하여 set -x실행 중인 항목을 표시합니다.

echo '-o ./output/clip2.mkv --language 0:eng clip2.mkv' '--language 0:ger ./ger/clip2.mka' '--language 0:spa ./spa/clip2.mka'

긴 작은따옴표 부분이 보이시나요? 이는 이것이 일련의 개별 인수가 아니라 공백을 포함하는 긴 인수임을 나타내는 방법입니다.

이 문제를 해결하려면 배열을 구축할 때 일반 참조(즉, 명령에 인수를 직접 전달할 때 사용하는 것과 동일한 참조)를 사용하세요. zsh는 기본적으로 토큰화를 수행하지 않으므로 기술적으로는 인용이 전혀 필요하지 않지만 다른 셸과 호환되는 인용 스타일을 따르는 것을 선호하므로 모든 변수 확장을 인용합니다.

#!/bin/zsh

mkdir -p output

for video in *.mkv
do
    audioargs=(-o "./output/${video}" --language 0:eng "./${video}")
    for audiodir in *(/)
        do
            audioargs+=(--language "0:${audiodir}" "./${audiodir}/${video:r}.mka")
        done
    echo "${audioargs[@]}"
done

결과는 다음과 같습니다 set -x.

echo -o ./output/clip2.mkv --language 0:eng ./clip2.mkv --language 0:ger ./ger/clip2.mka --language 0:spa ./spa/clip2.mka

관련 정보