내부 루프 조건은 외부 루프 작동에 따라 달라집니다.

내부 루프 조건은 외부 루프 작동에 따라 달라집니다.

루프 조건이 실행 중인 외부 루프에 따라 달라지도록 내부 루프를 어떻게 구성할 수 있습니까?

내 상황은 내가 찾고 있는 코드에 중요하지 않을 수 있지만 상황은 다음과 같습니다. URL이 두 매개변수에 따라 달라지는 변경 URL에서 실행하려는 크롤러가 있습니다. 첫 번째는 연도이고 두 번째는 페이지이며 페이지 범위는 해마다 다릅니다.

내가 지금까지 시도한 것은 다음과 같습니다.

#!/bin/bash

numbers2004={625..721}
numbers2005={723..823}

for year in 2004 2005
do
  for number in numbers$year
  do
    echo "$year $number"
  done
done

그것은 나에게 주어야한다

2004 625
2004 626
...
2004 720
2004 721
2005 723
2005 724
...
2005 822
2005 823

답변1

현재 bash 버전 사용:

#!/bin/bash

declare -A numbers    # declare associative array
printf -v numbers[2004] "%s " {625..721}
printf -v numbers[2005] "%s " {723..823}

for year in 2004 2005
do
  for number in ${numbers[$year]}
  do
    echo "$year $number"
  done
done

답변2

다음은 Cyrus의 답변을 변형한 것입니다.매개변수 간접. 그러나 링크에서 알 수 있듯이 배열 기반 접근 방식은 간접 접근 방식을 사용하는 것보다 선호됩니다.평가하다, 최대한 피해야 합니다.

(출력을 조금 더 작게 만들기 위해 OP에 제공된 숫자 범위를 좁혔습니다).

#!/usr/bin/env bash

printf -v numbers2004 "%d " {625..635}
printf -v numbers2005 "%d " {723..733}

for year in 2004 2005
do
    numbers="numbers$year"
    for number in ${!numbers}
    do
        printf "%s %s\n" "$year" "$number"
    done
done

산출

2004 625
2004 626
2004 627
2004 628
2004 629
2004 630
2004 631
2004 632
2004 633
2004 634
2004 635
2005 723
2005 724
2005 725
2005 726
2005 727
2005 728
2005 729
2005 730
2005 731
2005 732
2005 733

답변3

변수를 통해 간접적으로 이를 달성할 수도 있습니다.

#!/bin/bash

numbers2004="$(printf "%s " {625..721})"
numbers2005="$(printf "%s " {723..823})"

for year in 2004 2005
do
  for number in $(eval echo \$numbers$year)
  do
    echo "$year $number"
  done
done

답변4

eval하고싶은대로 해야지 ...

numbers2004={625..721}
numbers2005={723..823}

for year in 2004 2005
do
  eval 'eval "for number in '"\$numbers$year"'
  do
    echo \"\$year \$number\"
  done"'
done

...인쇄...

2004 625
...
2004 721
2005 723
...
2005 823

그러나 이것은 끔찍한 방법입니다. 인용하는 것이 악몽일 뿐만 아니라 아마도 가장 중요한 것은 쉘이 모든 작업을 수행하기 때문입니다.두 배. 먼저 모든 {brace..expanded}반복 가능한 객체를 생성해야 합니다.앞으로그런 다음 각각을 반복합니다.

대신에 아마도:

y=4 n=623 c=721
while  [ "$((y+=$c<(c+=102*(c<(n+=1<<(c==n))))))" -lt 6  ] 
do    echo "200$y $n"
done

busybox ash... ksh93, , dash, yash, bash, zsh, 및 의 최신 버전에서도 mksh동일한 내용을 인쇄합니다 posh.

대부분의 산술 표현식과 마찬가지로 필요한 경우 내용의 일부만 평가하여 산술 표현식의 성능을 약간 더 향상시킬 수 있습니다.

y=4 n=623 c=721
while [ "$((c<(n+=1)?(y+=(n+=1)<(c+=102)):y))" -lt 6 ] 
do echo "200$y $n"
done

...위의 모든 쉘에서 동일하게 작동합니다. 단, ... 항상 삼항문의 모든 측면을 평가하는 busybox것처럼 보이 므로 예상대로 반복하지 못합니다.busyboxif expr ? true : false

관련 정보