for 루프에는 두 가지 구문 스타일이 있습니다.
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
for name [ [in [words ...] ] ; ] do commands; done
얼핏 보면 둘 다 표현할 수 있는 루프 유형은 서로 아무런 관련이 없어 보입니다. 첫 번째는 산술 표현식을 기반으로 루프를 표현할 수 있는 반면, 두 번째는 집합의 열거된 멤버를 기반으로 루프를 표현할 수 있습니다 words
.
본질적으로 표현될 수 있는 루프 유형이 실제로 다른가요, 아니면 서로 동일합니까? 전자라면 언제 어느 것을 사용해야 할까요?
답변1
두 번째 형식은 항상 유한하며, 첫 번째 형식은 단순히 무한 반복되도록 만들 수 있습니다.
for ((;;)); do echo $SHELL; done
답변2
첫 번째
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
틀림없이 두 번째보다 더 일반적입니다.
for name [ [in [words ...] ] ; ] do commands; done
왜냐하면
- 표현식에 사용된 변수는 배열 인덱스로 사용될 수 있습니다(그리고 두 번째 항목에 사용된 단어 목록에서 선택 항목을 가져옵니다).
- 그러나 두 번째 형식은 변경되지 않은 단어 목록을 사용하여 단계별로 진행합니다(그러나 첫 번째 형식은 다음을 사용합니다).표현하다루프를 종료하는 데 사용됩니다. 이는 루프 종료가 동일한 정도로 미리 결정되지 않음을 의미합니다.
답변3
이것:
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
(( ))
정수에 대한 반복은 ;
각 부분(나누기) 내에 "산술 표현식"이 있기 때문에 이렇게 해야 합니다.
이는 c
for 루프와 유사하며 시작, 끝 및 "단계 동작"을 한 줄에 정의하여 더 간결하게 만듭니다.
두 번째는 숫자, 문자열 또는 배열일 수 있는 단어 목록에 대해 작동합니다.
for a in 1 2 3 4 5; do echo "$a"; done
for a in one two three four five; do echo "$a"; done
for a in "${one[@]}" ; do echo "$a"; done
단어 목록은 쉘 분할의 영향을 받으며 이는 이전 구성에서는 문제가 되지 않습니다.