zsh 및 bash의 For 루프

zsh 및 bash의 For 루프

루프를 만드는 데 두 가지 다른 방법이 있다는 것을 알았습니다.다루기 힘든:

  1. for x (1 2 3); do echo $x; done
  2. for x in 1 2 3; do echo $x; done

그들은 모두 다음과 같이 인쇄합니다.

1
2
3

내 질문은 왜 두 가지 구문이 있습니까? $x다른 것에 대한 반복객체 유형그들 각각에서?

하다세게 때리다비슷한 구별을 하시나요?

부록:

다음은 왜 작동합니까? :

#!/bin/zsh
a=1
b=2
c=5    

d=(a b c)    
for x in $d; do print $x;done

그런데 이건 아니지? :

#!/bin/zsh
a=1
b=2
c=5

d=(a b c)    
# It complains with "parse error near `$d'"
for x $d; do print $x;done 

답변1

다양한 형태의 복잡한 명령(예: 루프)에는대체 형태zsh에서. 이러한 형태의 대부분은 다음에서 영감을 얻었습니다.C 쉘, 이는 zsh가 어렸을 때 꽤 흔했지만 지금은 사라졌습니다. 이러한 대체 형식은 구문을 제외하고 일반 형식과 정확히 동일하게 작동합니다. 약간 더 짧지만 덜 명확합니다.

명령의 표준 형식 forfor x in 1 2 3; do echo $x; done, 명령의 표준 형식 while은 입니다 while test …; do somecommand; done. Ksh, bash 및 zsh는 정수를 열거하기 위해 Pascal 또는 C와 같은 언어로 루프를 에뮬레이트하는 또 다른 형식 for을 갖습니다. zsh에 존재하는 다른 이국적인 형태는 zsh 전용입니다(그러나 csh에서 영감을 받은 경우가 많습니다).for ((i = 0; i < 42; i++)); do somecommand; donefor

답변2

내 사용 사례에는 패치가 필요한 글꼴 파일(즉, 많은 .ttf파일)이 많이 있으며, 스크립트 파일에 저장하지 않고 터미널에서 직접 스크립트 명령을 입력하고 실행하고 싶습니다.

for x in JetBrainsMonoNL* ; do \
    fontforge -script fontpatcher $x --mono -l -q --fontawesome \
        --octicons --fontlogos --mdi --powerline --powerlineextra; \
done;

요점은 다음과 같습니다. JetBrainsMonoNL*첫 번째 형식으로 작성된 경우 반복할 배열이 됩니다.

for x in (JetBrainsMonoNL*)

괄호는 (적어도 초보자인 나에게는) 중복되어 보이며 이것이 표준이 괄호 없이 정의되는 이유라고 생각합니다.


저는 이 스크립트를 작성하는 방법을 배우고 있는데 제목에 따라 이 질문을 발견했으며 이 답변이 저와 같은 초보자에게 도움이 될 것이라고 생각했습니다. 이것은 허용되는 답변의 실제 사례라고 생각할 수 있습니다.

관련 정보