it-swarm.dev

bash에서 for 루프의 루프 제어에서 정수 변수를 사용할 수 있습니까?

다음 bash 스크립트가 있습니다.

#!/bin/bash

upperlim=10

for i in {0..10}
do
echo $i
done

for i in {0..$upperlim}
do
echo $i
done

첫 번째 for 루프 (without 루프 제어의 변수 upperlim)는 정상적으로 작동하지만 두 번째 for 루프 (with 루프 제어에서 변수 upperlim)는 그렇지 않습니다. 작동하도록 두 번째 for 루프를 수정할 수있는 방법이 있습니까? 시간 내 줘서 고마워.

70
Andrew

그 이유는 bash에서 발생하는 순서입니다. 중괄호 확장이 발생합니다 이전 변수가 확장됩니다. 목표를 달성하려면 C 스타일 for 루프를 사용해야합니다.

upperlim=10

for ((i=0; i<=upperlim; i++)); do
   echo "$i"
done
67
jordanm

내장 기능 만 사용하여 스타일을 완성하려면 eval을 사용해야합니다.

d=12

for i in `eval echo {0..$d}`
do
echo $i
done

그러나 seq의 경우 :

lowerlimit=0
upperlimit=12

for i in $(seq $lowerlimit $upperlimit)
do
echo $i
done

개인적으로 나는 seq의 사용이 더 읽기 쉽다는 것을 알았습니다.

31
Jodie C

POSIX 방식

이식성에 관심이 있다면 POSIX 표준의 예 를 사용하십시오.

i=2
END=5
while [ $i -le $END ]; do
    echo $i
    i=$(($i+1))
done

산출:

2
3
4
5

not POSIX :

매개 변수 확장 전에 bash 괄호 확장이 발생하므로 접근 방식이 작동하지 않습니다. 변수를 먼저 확장해야합니다.

eval 으로 해결할 수 있습니다.

upperlim=10
eval '
        for i in {0..'"$upperlim"'}
        do
                echo $i
        done
'

루프 동안 :

upperlim=10
#with while
start=0
while [[ $start -le $upperlim ]]
do
    echo "$start"
    ((start = start + 1))
done

또한 seq 명령 을 사용하여 수행 할 수 있습니다.

upperlim=10
#seq
for i in $(seq "$upperlim"); do
  echo "$i"
done

for i in {0..$upperlim}로 실행하려면 kornshell을 사용해야합니다. 예 :

#!/bin/ksh
upperlim=10

for i in {0..$upperlim}
do
        echo $i
done
1
Kheshav Sewnundun