나는 이것이 간단하다고 생각했지만 예상보다 더 복잡하다는 것을 증명하고 있습니다.
디렉토리에서 특정 유형의 모든 파일을 반복하고 싶으므로 다음과 같이 작성하십시오.
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
디렉토리에 일치하는 파일 이 하나 이상있는 한 작동합니다 . 그러나 일치하는 파일이 없으면 다음과 같은 결과를 얻습니다.
current file is *.zip
그런 다음 시도했습니다.
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
파일이 없을 때 루프 본문이 실행되지 않지만 ls에서 오류가 발생합니다.
ls: *.zip: No such file or directory
일치하는 파일을 깔끔하게 처리하는 루프는 어떻게 작성합니까?
FILES=
LS * .ZIP ; for fname in "${FILES}"...
하지만 예상대로이 작업을 수행for fname in *.zip ; do....
for file in *.zip
하지 말고 사용하십시오 `ls ...`
. @cuonglm의 제안은 *.zip
패턴이 파일과 일치하지 않을 때 아무것도 확장되지 않도록하는 것입니다. ls
인수 없이는 현재 디렉토리를 나열합니다.
ls
: 일반적으로 피해야하는 이유는 없습니다 구문 분석을 ls
? ; 또한 페이지 상단 부근의 BashGuide 's ParsingLs 기사 링크를 참조 하십시오.
shopt -s nullglob
for 루프를 실행하기 전에 추가하십시오 .