Bash - 끝 중 하나가 변수인 경우 범위가 더 이상 원하는 대로 작동하지 않습니다.

Bash - 끝 중 하나가 변수인 경우 범위가 더 이상 원하는 대로 작동하지 않습니다.
#!/bin/bash
myfirstarray=(1 3 5 7 9 11)
for i in {2..4}
    do
    for j in {1..${myfirstarray[$((i-1))]}}
        do
            echo ${j}
        done
    done

위 코드에서 외부 루프의 범위는 필요에 따라 해석되어 에서 까지 2반복됩니다 4. 내부 루프 범위 내의 두 대체도 모두 유효합니다. 그러나 내부 범위는 정수 범위가 아닌 문자열로 해석됩니다. 이 문제를 어떻게 해결할 수 있나요?

예상되는:

1
2
3
1
2
3
4
5
1
2
3
4
5
6
7

결과:

{1..3}
{1..5}
{1..7}

답변1

Bash에서는 중괄호 확장이 다른 확장보다 먼저 수행되므로 그 안에서 확장을 사용할 수 없습니다. 이것은 여기서 가장 일반적인 질문 중 하나입니다.

zsh문제를 해결하기 위해 (어디 {x..y}에서 왔는지) 또는 ksh93또는 같은 다른 쉘을 사용할 수 있지만 일반적으로 루프에서 중괄호 확장을 사용 yash -o braceexpand하고 싶지 않습니다. 예를 들어 전체 숫자 목록을 메모리에 여러 번 저장하는 것과 관련이 있기 때문입니다. 그것을 사용하는 것만큼이나 나쁩니다 .forfor i in {1..1000000}for i in $(seq 1000000)

ksh93의 C와 유사한 루프를 사용하는 것이 좋습니다.

#! /bin/bash -
myfirstarray=(1 3 5 7 9 11)
for (( i = 2; i <= 4; i++ )); do
  for (( j = 1; j <= myfirstarray[i-1]; j++ )); do
     echo "$j"
  done
done

코드에서 이해가 되지 않는 분할+glob 호출도 제거했습니다.

zsh로 전환하면 다른 이점도 있습니다. 예를 들어 위의 코드는 다음과 같습니다.

#! /bin/zsh -
myfirstarray=(1 3 5 7 9 11)
for i ({2..4}) for j ({1..$myfirstarray[i]}) echo $j

또는:

#! /bin/zsh -
myfirstarray=(1 3 5 7 9 11)
for i ($myfirstarray[2,4]) for j ({1..$i}) echo $j

관련 정보