나는 명령을 읽었다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
단일 선택적 개행 문자입니다. 마지막 것은 당신 것입니다 .;
linebreak
do_group
do ...; done
이는 유효한 for
루프가 다음과 같다는 것을 의미합니다.
주기
"$@"
:for name do ...; done
주기
"$@"
:for name; do ...; done
빈 목록을 반복합니다.
for name in; do ...; done
비어 있지 않은 목록을 반복합니다.
for name in word-list; do ...; done
세 번째 형식은 작동하지만 아무 작업도 수행하지 않습니다. 단어 목록이 빈 루프로 확장될 수 있도록 하기 위해 존재합니다.