이 두 가지 for 루프 스타일의 표현 내용에 차이가 있나요?

이 두 가지 for 루프 스타일의 표현 내용에 차이가 있나요?

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

(( ))정수에 대한 반복은 ;각 부분(나누기) 내에 "산술 표현식"이 있기 때문에 이렇게 해야 합니다.

이는 cfor 루프와 유사하며 시작, 끝 및 "단계 동작"을 한 줄에 정의하여 더 간결하게 만듭니다.

두 번째는 숫자, 문자열 또는 배열일 수 있는 단어 목록에 대해 작동합니다.

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

단어 목록은 쉘 분할의 영향을 받으며 이는 이전 구성에서는 문제가 되지 않습니다.

관련 정보