for 루프에 변수를 넣는 방법은 무엇입니까? [복사]

for 루프에 변수를 넣는 방법은 무엇입니까? [복사]
for seq in {046725..046899}
do
   #body
done

위의 코드 조각은 선행 0을 유지하면서 정상적으로 실행됩니다.순서변수인데 아래 스니펫이 실행되지 않는 이유는 무엇입니까? 해결 방법이 무엇입니까? 나는해야한다 순서선행 0이 있는 경우 for 루프의 변수에는 선행 0이 있습니다.

lowest=046725
highest=046899
for seq in {$lowest..$highest}
do
  #body
done

답변1

"Brace 확장은 다른 확장보다 먼저 수행됩니다" - bash 매뉴얼에서. 그 다음은 변수 확장입니다.

답변2

이를 수행하려면 다음 코드를 사용할 수 있어야 합니다.

#!/bin/bash

lowest=046725
highest=046899
width=6

for (( seq=10#$lowest; seq<=10#$highest; seq++))
  do

    length=`echo -n $seq | wc -c`

    if [[ $length < $width ]]; then

      number_of_zeroes_to_add=`expr $width - $length`

      for zeroes in `seq $number_of_zeroes_to_add`;
        do echo -n 0;
      done

    fi

    echo $seq


done

이 기능이 수행하는 작업은 숫자의 너비(예: 6자 너비)를 결정하고 이 너비에 맞지 않는 숫자(앞의 0이 잘렸기 때문에)를 식별한 다음 다시 삽입하는 것입니다.

답변3

중괄호 확장은 {...}매개변수 확장보다 훨씬 앞서 있습니다 ${..}.

중괄호 확장을 수행하기 위해 줄을 다시 처리하고 $var 내부의 값을 가져오는 한 가지 방법은 다음을 사용하는 것입니다 eval(이 경우 권장되지 않으며 실제로 필요하지도 않음).

lowest=046725
highest=046899
for for seq in $(eval echo {$lowest..$highest});
do
    #body
done

제한된 숫자에 앞에 0이 없으면 더 좋지만, 그렇다면 숫자도 변환됩니다.

요청 시 출력에는 앞에 0이 붙습니다. 단일 엔터티에 의해 제어됩니다 printf. 두 개의 0이 필요한 경우 06로 변경하십시오.07

#!/bin/bash

lowest=046725              highest=046899

seq="$(( 10#$lowest ))"    max="$(( 10#$highest ))"

while    (( seq <= max ))
do       printf '%06d\n' $(( seq++ ))
done

변수에 결과가 필요한 경우 다음 줄을 사용하고 var를 사용하세요.

do       printf -v var '%06d\n' $(( seq++ ))

아직 하나 있어요sh버전:

#!/bin/sh

lowest=00046725    highest=000046899

seq=${lowest#"${lowest%%[!0]*}"}
max=${highest#"${highest%%[!0]*}"}

while    [ $seq -le $max ]
do       printf '%06d ' "$seq"
         seq=$(( seq + 1 ))
done

관련 정보