“in foo bar…”부분이없는 배쉬“for”루프


25

나는 최근에 작동하고 기대하지 않았기 때문에 나를 혼란스럽게하는 일부 코드를 찾고있었습니다. 코드는이 예제로 축소됩니다

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

명령 행 인수로 실행하면 해당 인수가 인쇄됩니다.

$ ./test a b c
a
b
c

이것이 바로 나에게 예상치 못한 일입니다. var정의되지 않았기 때문에 왜 에러가 발생하지 않습니까? 이것을 '좋은 습관'으로 간주하고 있습니까?

답변:


27

forin value1 value2...모든 Bourne과 같은 쉘에 부품이 지정 되지 않은 경우 위치 매개 변수에서 루프가 반복됩니다 .

70 년대 후반의 Bourne 쉘에서는 이미 그랬지만 Bourne 쉘에서는 생략해야합니다 ;( for i do이전 줄 바꿈이 필요한 일부 오래된 애쉬 버전 제외 do).

Bash for 루프에서 "do"키워드의 목적은 무엇입니까?를 참조하십시오 . 놀라운 변형을 포함한 더 많은 정보가 필요 합니다.

하기:

for i
do
  something with "$i"
done

좋은 습관입니다. 일반적으로 동등한 것보다 약간 더 휴대 가능하고 신뢰할 수 있습니다.

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

하는 Bourne 쉘은 (때 같은 일부 조건에서 몇 가지 문제가 ksh88 $#Bourne 쉘의 일부 버전에서 0입니다 ( ${1+"$@"}대신 "$@"해결할 수)하거나 $IFS, 또는 Bourne 씨와 ksh88의 공백 문자를 포함하지 않음) 이 nounset옵션은 활성화되어 $#있으며 일부 쉘의 일부 버전에서 bash( 다시 ${1+"$@"}해결 방법으로 ) 0입니다.


내 뇌가 시작시 반복되는 '루프'편집을 중단하기로 결정하기 전에이 세 번을 읽었
Three Diag

20

이것이 기본 동작입니다. 그것은에서 설명 helpfor키워드 :

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에 의해 정의 되므로 "좋은 습관"으로 간주됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.