[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
위의 배쉬 방법에 대한 작동 ksh
및 zsh
도,시는 bash -c
대체됩니다 ksh -c
또는 zsh -c
각각.
참고 : 및 for i in {2..${max}}; do echo $i; done
에서 작동합니다 .zsh
ksh
답변
C 프로그래밍처럼 루프를 반복 할 수 있습니다.
#!/bin/bash
for ((i=1; i<=20; i=i+1))
do
echo $i
done