while 루프가 루프 조건을 어떻게 평가하는지 알고 싶습니다. 매뉴얼 페이지에는 다음과 같이 나와 있습니다.
그리고 목록-1을 수행합니다.
while 명령은 list-1의 마지막 명령이 종료 상태 0을 반환하는 한 list-2를 계속 실행합니다.
그리고
목록
목록은 &, && 또는 || 연산자 중 하나로 구분되고 선택적으로;, & 또는 or 중 하나로 끝나는 하나 이상의 파이프 시퀀스입니다.
그리고
관로
파이프는 제어 연산자 |로 구분된 하나 이상의 명령 시퀀스입니다. 또는 |&. 파이프의 형식은 다음과 같습니다.
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
이는 다음을 의미합니다.
while <single-command>; do <list>; done;
유효한 구문입니다. 반환 되자마자 <single-command>
목록이 실행됩니다 0
. 이렇게 while 루프를 실행하면 (분명히) 오류가 발생합니다.
$while aaa; do echo "foo"; done;
If 'aaa' is not a typo you can use command-not-found to lookup the package that contains it, like this:
cnf aaa
$while ; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
$while ""; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
놀랍게도 균일 변수를 bar
as 로 사용하면 <single-command>
무한 루프가 발생합니다.
$while $bar; do echo "foo"; done;
foo
foo
foo
...
bar
이는 get 인수가 빈 문자열(?)로 확장되고, 실행(?)되며, 항상 0을 반환한다는 의미입니다 . 그런데 왜 내 둘째는 안 그래?오류 예평등한 노동? 재미있게:
$while "$bar"; do echo "foo"; done;
Absolute path to '' is '/usr/sbin/', so running it may require superuser privileges (eg. root).
작동하지 않습니다. 이것은 나의 세 번째 오류 예에 해당합니다. $bar는 빈 문자열로 확장되며 이스케이프 처리되지 않은 따옴표는 유지됩니다.
그래서 내 질문은: 쉘(내 경우에는 bash)이 어떻게 해석합니까?
$while $bar; do echo "foo"; done;
명령으로 인해 무한 루프가 발생합니까?
고쳐 쓰다:
나는 빈 명령(아무 것도 하지 않고 0을 반환함)을 에뮬레이트하는 것이 어렵지 않다는 것을 알았습니다. 빈 명령은 에 해당합니다 :
. 따라서 종료되지 않는 while 루프는 다음과 같이 작성할 수 있습니다.
while :; do echo "foo"; done;
답변1
이 while
명령어 뒤에는 루프해야 하는지 여부를 결정하기 위해 반환 코드를 계산하는 명령이 옵니다. 반환 값이 이면 실행이 계속됩니다 0
.
초기화되지 않은 변수를 참조하는 것은 ""로 초기화하는 것과 같습니다.
빈 명령을 실행해도 오류가 발생하지 않으므로 적절한 반환 코드( 0
)가 반환됩니다.
$ foo=''
$ $foo
$ echo $?
0
이는 정상적인 동작입니다. 그렇지 않으면 아무 것도 입력하지 않고 Enter 키를 누를 때마다 쉘에서 오류가 발생합니다.
이는 쉘이 문제로 인식하는 빈 문자열을 지정하는 것과 다릅니다.
$ ''
-bash: : command not found
$ echo $?
127