![for 루프 구문 분석 ls와 그 뒤에 숨은 마법 *](https://linux55.com/image/208913/for%20%EB%A3%A8%ED%94%84%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%20ls%EC%99%80%20%EA%B7%B8%20%EB%92%A4%EC%97%90%20%EC%88%A8%EC%9D%80%20%EB%A7%88%EB%B2%95%20*.png)
나는 다음 사항이 좋지 않다는 것을 알고 있습니다.
for i in `ls -1 *.MOV` ;do ...
올바른 구문은 다음과 같습니다.
for i in *.MOV ;do ...
그러나 그 뒤에 있는 메커니즘은 무엇입니까? 내 말은, *.MOV
파일 이름에 대해 이야기하고 있다는 것을 for 명령에 알려주는 부분은 무엇입니까? for
"다른 매개변수가 없으면 파일 이름이 가정됩니다"라는 가정이 코드에 있습니까 ?
그리고... ls
for 내부의 출력이 끔찍하다면 차단되지 않는 사용 가능한 파일 이름 목록을 어떻게 얻을 수 있습니까?
답변1
예 :-) 쉘은 와일드카드 표현식과 일치하는 파일 세트(귀하의 경우 현재 디렉토리에 있는 MOV 파일)로 와일드카드를 확장합니다. 하지만 그러기 전에 여섯 가지 다른 확장팩을 고려해야 합니다.
"확장"은 매뉴얼에 자세히 설명되어 있습니다 man bash
.
확장
확장은 단어로 분할된 후 명령줄에서 수행됩니다. 중괄호 확장, 물결표 확장, 매개변수 및 변수 확장, 명령 대체, 산술 확장, 토큰화, 경로 이름 확장 등 7가지 유형의 확장이 수행됩니다.
...
경로명 확장
단어 분할 후 bash는 -f 옵션이 설정되지 않은 한 각 단어에서 *, ? 및 [ 문자를 검색합니다. 이러한 문자 중 하나가 발생하면 해당 단어는 패턴으로 처리되고 패턴과 일치하는 파일 이름의 알파벳순 목록으로 대체됩니다(아래 패턴 일치 참조). 일치하는 파일 이름이 없고 쉘 옵션 nullglob이 활성화되지 않은 경우 단어는 변경되지 않고 그대로 유지됩니다.