[unix] 쉘 스크립트“for”루프 구문

나는 일하기 위해 다음을 얻었습니다.

for i in {2..10}
do
    echo "output: $i"
done

이 라인의 무리를 생산 output: 2, output: 3등등.

그러나 다음을 실행하려고합니다.

max=10
for i in {2..$max}
do
    echo "$i"
done

다음을 생성합니다.

output: {2..10}

컴파일러가 $ max를 배열의 다른 끝으로 취급해야하며 문자열의 일부가 아니라는 것을 어떻게 알 수 있습니까?



답변

괄호 확장, {x..y} 는 다른 확장보다 먼저 수행되므로 가변 길이 시퀀스에는이를 사용할 수 없습니다.

대신, 사용자 mob가 언급 한대로이seq 2 $max 방법을 사용하십시오 .

예를 들어 다음과 같습니다.

max=10
for i in `seq 2 $max`
do
    echo "$i"
done


답변

의 산술 표현 버전을 사용해보십시오 for:

max=10
for (( i=2; i <= $max; ++i ))
do
    echo "$i"
done

이것은 대부분의 bash 버전에서 사용 가능하며 Bourne 쉘 (sh)과 호환되어야합니다.


답변

루프를 수동으로 단계 :

i = 0
최대 = 10
[$ i -lt $ max] 동안
하다
    에코 "출력 : $ i"
    진정한 $ ((i ++))
끝난

완전히 POSIX 일 필요는없는 경우 산술 for 루프를 사용할 수 있습니다 .

최대 = 10
for ((i = 0; i <max; i ++)); 에코 "출력 : $ i"; 끝난

또는 사용 BSD 시스템에서 jot (1)을 .

i의 경우 $ (jot 0 10); 에코 "출력 : $ i"; 끝난


답변

여러 가지 방법이 있습니다.

max=10
for i in `eval "echo {2..$max}"`
do
    echo "$i"
done


답변

seq시스템 에서 명령을 사용할 수있는 경우 :

for i in `seq 2 $max`
do
  echo "output: $i"
done

그렇지 않은 경우 가난한 사람을 다음 seq과 함께 사용하십시오 perl.

seq=`perl -e "\$,=' ';print 2..$max"`
for i in $seq
do
  echo "output: $i"
done

그 인용 부호를보십시오.


답변

이것은 방법입니다 :
Bash :

max=10
for i in $(bash -c "echo {2..${max}}"); do echo $i; done

위의 배쉬 방법에 대한 작동 kshzsh도,시는 bash -c대체됩니다 ksh -c또는 zsh -c각각.

참고 : 및 for i in {2..${max}}; do echo $i; done에서 작동합니다 .zshksh


답변

C 프로그래밍처럼 루프를 반복 할 수 있습니다.

#!/bin/bash
for ((i=1; i<=20; i=i+1))
do
      echo $i
done