이 BASH 구조에 해당하는 ZSH를 찾고 있습니다.
for file in *.{abc,def,ghi}; do #loop through all files with the extensions .abc, .def and .ghi
ZSH에 대한 유사한 구성을 찾을 수 없습니다. 아니면 아닐 수도 있나요?
답변1
다음 파일이 있다고 가정합니다: foo.abc
, bar.abc
, qux.ghi
. bash에서 루프 본문은 foo.abc
, bar.abc
, *.def
(리터럴 사용 *
) 및 를 사용하여 4번 실행됩니다 qux.ghi
. zsh에서 기본 옵션을 사용하면 루프가 전혀 실행되지 않지만 오류가 발생합니다
zsh:1: no matches found: *.def
확장되지 않은 와일드카드 패턴에서 루프 실행을 방지하고 기존 파일(있는 경우)에서 루프를 실행하려면 다음을 추가하십시오.N
글로벌 예선.
for file in *.{abc,def,ghi}(N); do …
당신은 또한 사용할 수 있습니다|
운영자, 따라서 여러 스키마 대신 하나의 스키마를 갖게 됩니다. (중괄호는 와일드카드 패턴이 아니며, 와일드카드가 구문 분석되기 전에 발생하는 리터럴 문자열 확장일 뿐입니다. 즉, *.{abc,def,ghi}(N)
의 약어입니다 *.abc(N) *.def(N) *.ghi(N)
.)
for file in *.(abc|def|ghi)(N); do …
여전히 N
glob 한정자가 필요합니다. 그렇지 않으면 일치하는 파일이 없으면 오류가 발생합니다.
N
glob 한정자 없이도 할 수 있습니다.null_glob
이 옵션을 켜세요( setopt null_glob
). 이는 일반적으로 스크립트에서 의미가 있습니다. Bash에서는 shopt -s nullglob
언롤링 모드에서 루프 본문이 실행되는 것을 방지하려면 유사한 옵션( )을 활성화해야 합니다 .