Bash for 루프에서“do”키워드의 목적은 무엇입니까?


76

doBash for루프 구문 에서 키워드 의 목적은 무엇입니까 ? 나에게 그것은 중복 느낌입니다.

for i in `seq 1 2`; do echo "hi"; done

왜 이런 문법이 아닌가?

for i in `seq 1 2`; echo "hi"; done

나는 확신 않는 목적을 입력합니다. 그냥 배우고 싶어

답변:


118

구문은 Bourne 쉘에서 상속됩니다.

변수 이름 in다음에 명시 적으로 지정된 요소 목록을 갖거나 do위치 매개 변수를 반복 하도록 할 수 있습니다 .

for i in 1 2 3
do
  echo "$i"
done

또는

set 1 2 3
for i do
  echo "$i"
done

갖는 do(엄격히 첫 번째에 필요한 아닌 경우에도) 두 경우 모두에서하는 것은 더 일관된 구문 있습니다. 또한 필요한 곳에서 while/ until루프 와 일치 do합니다.

while
  cmd1
  cmd2
do
  cmd3
  cmd4
done

당신은 필요한 do목록 어디에 있는지 조건이 끝을 명령한다.

Bourne 쉘은 지원하지 않습니다 for i; do. 이 구문은 2016 년 표준 버전까지 for i do항상 POSIX가 아니 었습니다 ( 항상 POSIX 였습니다. 관련 Austin 그룹 버그 참조 ).

zsh 다음과 같은 몇 가지 속기 형식이 있습니다.

for i in 1 2 3; echo $i
for i (1 2 3) echo $i
for ((i=1;i<=3;i++)) echo $i

또는 하나 이상의 변수를 지원합니다.

for i j (1 a 2 b) echo $i $j

( 위 대신 in또는 do변수 이름으로 사용할 수는 없지만 j).

거의 문서화되지 않더라도, 대부분의 본쉘 (Bourne의, KSH, 배쉬, zsh을하지 ash않고 yash)도 지원합니다

for i in 1 2 3; { echo "$i";}

Bourne 쉘 kshzsh(하지만 아님 bash)은 다음을 지원합니다.

for i { echo "$i"; }

동안 bash, ksh그리고 zsh(그러나 Bourne 쉘) 지원 :

for i; { echo "$i"; }

모든 (Bourne의, bash, ksh, zsh) 지원 :

for i
{ echo "$i";}

ksh93, bash, zsh지원 :

for ((i=1;i<=3;i++)) { echo "$i"; }

2
항상 그렇듯이, 완전하고 완벽한 답변 (zsh를 참조하여) ...
Kiwy

2
두 경우 모두 "엄격히 필요한"것은 아닙니다 for. 명령은 개행 또는 세미콜론으로 종료 될 수 있습니다. if/ while( then보다 오히려 전자)에 대해 더 의미가 do있지만 원칙적으로 그것들은 생략했을 수 있으며 여러 명령의 (희귀 한) 사용을 위해 서브 쉘 또는 중괄호가 필요했습니다. Bourne 쉘이 실제로 수행하는 이유는 ALGOL이 수행하기 때문이며 done철자가 아닌 것이 기쁘다 od.
Random832

4
@ Random832 : od옥타 덤프 프로그램의 이름으로 이미 사용 되었기 때문 입니다.
user1024

8
내가 알지 못하는 것이 너무 많습니다 . 감사합니다!
궤도에서 가벼움 경주

1
@mirabilos for i do는 Bourne과 POSIX이지만 이전 버전의 재 기반 셸 IIRC에서는 작동하지 않습니다. 공백 문자가 없으면 for i in "$@"Bourne 쉘에서 작동 $IFS하지 않습니다. for i<newline>do아주 오래된 BSD 시스템을 고려해야 할 경우 실제로 가장 이식성이 뛰어납니다. 자세한 내용은 in-ulm.de/~mascheck/various/bourne_args 를 참조하십시오
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.