명령의 여러 매개변수에 와일드카드를 적용할 수 있습니까?

명령의 여러 매개변수에 와일드카드를 적용할 수 있습니까?

저는 현재 쉘을 구현 중이며 잘 알려진 쉘을 기반으로 와일드카드의 동작을 모방하고 싶습니다.

foo두 개의 파일 이름 매개변수가 필요한 명령이 있다고 가정합니다 . 그건:

foo file1.txt file2.txt

올바른 사용법입니다. 또한 현재 디렉터리에 다음 파일이 있다고 가정합니다.

file1.txt
file2.txt
file3.txt

file1.dat
file4.dat

쉘(예: Bash)에서 명령을 실행할 때 여러 glob 인수를 사용할 수 있습니까? 예를 들어,

foo *.txt *.dat

그렇다면 이것은 무엇을 의미하거나 평가하는가? 어떤 조합이 다음과 같이 수행되는지 알고 싶습니다.

foo file1.txt file1.dat
foo file2.txt file4.dat
...

미리 감사드립니다!

답변1

틀림없이. 질문하는 데 걸리는 시간보다 짧은 시간에 직접 시도해 볼 수 있습니다.

Unix 쉘(예: bash)은 와일드카드를 확장합니다.앞으로이 프로그램을 호출하세요. 프로그램 자체에서는 매개변수의 사전 확장된 버전을 볼 수 없습니다.

따라서 귀하의 예에서는 foo여러 인수로 호출되며 첫 번째 인수는 확장자가 되고 *.txt마지막 인수는 확장자가 됩니다 *.dat.

일반적으로 확장자는 *.txt현재 디렉토리에 있습니다 .txt. 그렇지 않은 경우 확장자는 *.txt변경되지 않습니다 *.txt. 이는 및에 의해 shopt -s nullglob변경될 수 있습니다.set -f

답변2

glob을 배열로 확장하면 도움이 될 수 있습니다. 이는 foo페어링할 때마다 호출됩니다.

shopt -s nullglob

txts=(*.txt)
dats=(*.dat)

for txt in "${txts[@]}"; do
    for dat in "${dats[@]}"; do
        foo "$txt" "$dat"
    done
done

관련 정보