2013-06-19 7 views
10

bash for loop에서 변수를 사용하는 방법은 무엇입니까? 난 그냥 루프에 대한 표준을 사용하는 경우 는, 내가bash for loop에서 변수를 사용하는 방법

for i in {0..3} 
do 
    echo "do some stuff $i" 
done 

이 잘 작동 기대한다. 4 회 반복하여 0에서 3까지 반복하며 내 메시지를 출력하고 마지막에 카운트를 보냅니다.

do some stuff 0 
do some stuff 1 
do some stuff 2 
do some stuff 3 

다음과 같은 루프를 사용하여 동일한 작업을 시도하면 문자열과 같아 보입니다. 원하는 문자열이 아닙니다.

length=3 
for i in {0..$length} 
do 
    echo "do something right $i" 
done 

출력 :

do something right {0..3} 

나는

for i in {0..'$length'} (output was {0..$length}) 

for i in {0.."$length"} and for i in {0..${length}} (both output was {0..3}) 

을 시도하고 그들은 모두 내가 필요하지 않습니다. 잘만되면 누군가 나를 도울 수 있습니다. bash 전문가가 for 루프를 사용하는 것에 대해 미리 감사드립니다.

답변

12

한 가지 방법 eval을 사용하고 있습니다 : 당신이 length=;ls 또는 length=; rm *는 (비록 후자를 시도하지 않음) 설정 때 발생하는

for i in $(eval echo {0..$length}) 
do 
     echo "do something right $i" 
done 

.

for i in $(seq 0 $length) 
do 
     echo "do something right $i" 
done 

또는 당신은 또한 안전 루프에 대한 C 스타일, 사용할 수 있습니다 : 배쉬에서

for ((i = 0; i <= $length; i++)) 
do 
     echo "do something right $i" 
done 
+3

+1 '평가판'의 팬이 아니지만이 답변에서 다양한 옵션을 제공하는 것과 같습니다. –

+1

C 스타일 루프가 분명히 최상의 옵션입니다. –

4

을, 중괄호 확장은 처음 seq를 사용

안전하게, 단계가 시도되었으므로이 시점에서 $length은 대체되지 않습니다.

배시 상태의 맨은 :

순차 식의 형식을 취 x..y {[.. 증분]}, x 및 y는 정수 하나 또는 단일 문자 어디 ...

가능성의 수는 사용하는 것으로,이 있습니다

pax> for i in $(seq 0 $length) ; do echo $i ; done 
0 
1 
2 
3 

그것은 당신에게 큰 명령 줄을 줄 수 있지만 length이 방대한 경우

또 다른 대안은 C와 같은 구문을 사용하는 것입니다

pax> for ((i = 0; i <= $length; i++)) ; do echo $i; done 
0 
1 
2 
3 
3

브레이스 subtitutions 다른 전에 수행됩니다, 그래서 당신은 seq 같은 eval 또는 타사 도구를 사용할 필요가있다. 평가 용

예 :

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

이 정보는 실제로 man bash에서 찾을 수있다 :

순차 식의 형태를 취한다 {x..y [.. 증분]} 곳 x 및 y는 정수 또는 단일 문자이고, incr (선택적인 증가분)은 정수입니다. 는 [...]

브레이스 확장은 다른 확장 전에 수행되고, 다른 확장에 특수 문자는 모든 결과에 보존된다. 그것은 엄격히 텍스트입니다. Bash는 확장 문맥 또는 중괄호 사이의 텍스트에 구문 해석을 적용하지 않습니다.

관련 문제