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