Bash "for" 루프에는 "in foo bar..." 부분이 없습니다.

Bash "for" 루프에는 "in foo bar..." 부분이 없습니다.

나는 최근에 작동하기 때문에 나를 혼란스럽게 만드는 일부 코드를 보고 있었지만 작동할 것이라고는 기대하지 않았습니다. 코드는 이 예제로 단순화되었습니다.

#!/bin/bash
for var;
do
  echo "$var"
done

명령줄 인수로 실행하면 인쇄됩니다.

$ ./test a b c
a
b
c

(나로서는) 예상치 못한 일이었다. var정의되지 않았기 때문에 오류가 발생하지 않는 이유는 무엇입니까 ? 이것을 사용하는 것이 "좋은 습관"으로 간주됩니까?

답변1

forin value1 value2...Bourne과 유사한 모든 쉘에 부분이 지정되지 않은 경우 루프는 위치 인수를 반복합니다.

이는 70년대 후반부터 Bourne 쉘에 존재했지만 Bourne 쉘에서는 이를 생략해야 합니다 ;(사용할 수도 있습니다 for i do(일부 이전 ash 버전에서는 앞에 개행 문자를 추가해야 함 제외 do)).

바라보다Bash for 루프에서 "do" 키워드의 목적은 무엇입니까?더 많은 정보를 포함한 더 많은 정보를 원하시면기묘변종.

행위:

for i
do
  something with "$i"
done

좋은 생각이에요. 일반적인 제품보다 이식성과 신뢰성이 약간 더 높습니다.

for i in "$@"; do
  something with "$i"
done

Bourne 쉘, ksh88은 일부 경우(예: $#Bourne 쉘의 일부 버전에서 0인 경우( 고칠 수 ${1+"$@"}없음 "$@") 또는 $IFSBourne 및 ksh88에 공백 문자가 포함되지 않은 경우) 또는 이 nounset옵션이 활성화되어 $#있고 bash(를 포함하여 일부 쉘의 일부 버전에서는 0입니다.${1+"$@"}해결 방법으로 다시).

답변2

이것이 기본 동작입니다. 그렇습니다. help키워드 에 문서화되어 있습니다 for.

terdon@tpad ~ $ help for
for: for NAME [in WORDS ... ] ; do COMMANDS; done
    Execute commands for each member in a list.

    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.

    Exit Status:
    Returns the status of the last command executed.

따라서 반복할 목록을 제공하지 않으면 기본적으로 $@위치 인수 배열( a예에서는 ) 을 반복합니다 b.c

그리고 이 행동은POSIX에 의해 정의됨예, 현재로서는 이것이 "좋은 습관"으로 간주됩니다.

관련 정보