for 루프 범위 내의 bash 변수

for 루프 범위 내의 bash 변수

1부터 100까지의 숫자 목록을 인쇄하고 싶습니다. 다음과 같은 for 루프를 사용합니다.

number=100
for num in {1..$number}
do
  echo $num
done

명령을 실행하면 1부터 100까지의 숫자 목록 대신 {1..100}만 인쇄됩니다.

답변1

예, 중괄호 확장이 매개변수 확장 전에 발생하기 때문입니다. zshor 와 같은 다른 쉘을 사용 ksh93하거나 대체 구문을 사용하십시오.

표준(POSIX) sh 구문

i=1
while [ "$i" -le "$number" ]; do
  echo "$i"
  i=$(($i + 1))
done

Ksh 스타일for ((...))

for ((i=1;i<=number;i++)); do
  echo "$i"
done

사용 eval(권장하지 않음)

eval '
  for i in {1..'"$number"'}; do
    echo "$i"
  done
'

seq사용 가능한 시스템에서 GNU 명령 사용

unset -v IFS # restore IFS to default
for i in $(seq "$number"); do
  echo "$i"
done

(이 명령은 새 명령을 분기하고 실행하며 쉘이 파이프에서 출력을 읽어야 하기 때문에 효율성이 떨어집니다.)

셸에서 루프를 피하세요.

쉘 스크립트에서 루프를 사용하는 것은 일반적으로 루프를 올바르게 수행하지 않음을 나타냅니다.

대부분의 경우 코드를 다른 방식으로 작성할 수 있습니다.

답변2

for 루프도 필요하지 않습니다 seq. 다음을 사용하세요.

$ seq 100

인쇄된 처음 10개의 숫자는 다음과 같습니다.

$ seq 100 | head -10
1
2
3
4
5
6
7
8
9
10

답변3

다음을 사용할 수 있습니다.

for (( num=1; num <= 100; num++ ))
do
    echo $num
done

답변4

중괄호 확장은 리터럴 정수 또는 단일 문자에서만 작동합니다. 변수가 확장되기 전에 발생하므로 변수 내에서 사용할 수 없습니다.

관련 정보