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


65

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

#!/bin/bash

upperlim=10

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

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

for(루프 없이 가변 upperlim루프 제어)는 잘 작동하지만, 제 for(루프 가변 upperlim루프 제어)를하지 않는다. for작동하도록 두 번째 루프를 수정할 수있는 방법이 있습니까? 시간 내 줘서 고마워.


4
흠, 심지어 for i in {0..$((upperlim))}; do echo $i; done작동하지 않습니다
Bonsi Scott

+1 나는 흥미로운 그 행동 찾을 수 있기 때문에
Bonsi 스콧


이 답변에 대한 외부 링크 : cyberciti.biz/faq/…
kon psych

답변:


62

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

upperlim=10

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

1
그리고 zsh잘 작동합니다 ( csh, tcsh).
math

29

내장 기능 만 사용하여 스타일을 완성하려면 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이 더 읽기 쉽다 는 것을 알았습니다 .


"내장"? seq외부 명령이며 bash가있는 곳에서는 사용할 수 없습니다.
jordanm

9
@jordanm : bash와 함께 모든 내장을 사용합니다. 그런 다음 "하지만"이라고 말했지만 seq내장되어 있지 않다는 것을 인정했습니다.
Jodie C

괄호 확장이 내장되어 있다는 사실은 여기서 문제가되지 않습니다. read예를 들어 내장되어 있지만 그럴 이유가 없습니다 eval.
jordanm

1
내장은 전혀 문제가되지 않습니다. 나는 asker에게 all-bash 솔루션을 제공하고 싶었다. 이 문제에 대해 계속 논쟁하고 싶다면 대화를 나누십시오. 코멘트는 이런 종류의 일에 좋지 않습니다
Jodie C

8

POSIX 방식

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

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

산출:

2
3
4
5

POSIX 가 아닌 것 :


1

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

eval로 해결할 수 있습니다 .

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

While 루프 :

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.