for 루프가 루프 변수의 값 세트를 명시적으로 지정할 필요가 없는 이유는 무엇입니까? [복사]

for 루프가 루프 변수의 값 세트를 명시적으로 지정할 필요가 없는 이유는 무엇입니까? [복사]

나는 명령을 읽었다https://unix.stackexchange.com/a/175845/674

왜 그럴 수 있지?

$ bash -c 'for f do echo "$f";done' bash a b c
a
b
c

으로 출력

$ bash -c 'for f in "$@"; do echo "$f";done' bash a b c
a
b
c

?

for 루프를 명시적으로 지정할 필요가 없는 이유

  • in "$@"와 같은 루프 변수에 대한 값 세트

  • ;?

감사해요.

답변1

~에서배쉬 매뉴얼 페이지:

이름[[in[단어...]];] 수행할 작업 목록;

뒤에 오는 단어 목록이 확장되어 항목 목록이 생성됩니다. 목록의 각 요소에 변수명이 차례로 설정되며, 매번 목록이 실행됩니다.in 단어가 생략되면 for 명령은 각 위치 매개변수 세트에 대해 목록을 한 번씩 실행합니다.(아래 매개변수 참조) ...

그런 다음 매개변수 섹션에서 다음을 수행합니다.

위치 매개변수는 단일 숫자 0이 아닌 하나 이상의 숫자로 표시되는 매개변수입니다.위치 매개변수는 쉘이 호출될 때 쉘의 매개변수로부터 할당됩니다., set 내장 명령을 사용하여 재할당할 수 있습니다. ...

즉, in키워드와 다음 세미콜론은 선택 사항입니다. 키워드가 생략 되면 in루프의 인수는 for셸에 전달된 인수에서 가져옵니다. 따라서 제공한 두 코드 예제는 동일합니다.

답변2

POSIX 구문으로 인해허락하다.

for 루프의 형식은 다음과 같습니다.

for name [ in [word ... ]]
do
    compound-list
done

먼저, 뒤에 오는 단어 목록을 확장하여 항목 목록을 생성해야 합니다. 그런 다음 각 항목에 대한 변수 이름을 차례로 설정하고 매번 복합 목록을 실행합니다. 확장으로 인해 항목이 생성되지 않으면 복합 목록을 실행하면 안 됩니다. 생략:

in word...

다음과 같아야 합니다:

in "$@"

루프의 형식적인 구문 for은 다음과 같습니다

for_clause       : For name                                      do_group
                 | For name                       sequential_sep do_group
                 | For name linebreak in          sequential_sep do_group
                 | For name linebreak in wordlist sequential_sep do_group

For문자열의 구문 표시입니다 for. 하나 이상의 개행 문자이며 sequential_sep단일 선택적 개행 문자입니다. 마지막 것은 당신 것입니다 .;linebreakdo_groupdo ...; done

이는 유효한 for루프가 다음과 같다는 것을 의미합니다.

  1. 주기 "$@":

    for name do ...; done
    
  2. 주기 "$@":

    for name; do ...; done
    
  3. 빈 목록을 반복합니다.

    for name in; do ...; done
    
  4. 비어 있지 않은 목록을 반복합니다.

    for name in word-list; do ...; done
    

세 번째 형식은 작동하지만 아무 작업도 수행하지 않습니다. 단어 목록이 빈 루프로 확장될 수 있도록 하기 위해 존재합니다.

관련 정보