Como colocar variável em loops for? [duplicado]

0
for seq in {046725..046899}
do
   #body
done

O segmento acima do código é executado lindamente, mantendo os zeros anteriores na variável seq , mas por que o seguimento do segmento de código não é executado? Existe alguma maneira? Eu preciso da variável seq para que os loops tenham zeros precedentes se houver algum zero precedente.

lowest=046725
highest=046899
for seq in {$lowest..$highest}
do
  #body
done
    
por Milon Corleone 11.01.2016 / 07:04

3 respostas

0

Você deve conseguir isso com o seguinte código:

#!/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

O que isso está fazendo é estabelecer uma largura do número (por exemplo, 6 caracteres), identificando números que não correspondem a essa largura porque os zeros à esquerda foram truncados e, em seguida, reinseridos.

    
por 11.01.2016 / 07:21
2

"A expansão de contraventamento é executada antes de qualquer outra expansão" - do manual bash. Expansão variável seguida depois.

    
por 11.01.2016 / 07:47
0

Expansão do intervalo {...} está muito à frente das Expansões do Parâmetro ${..} .

Uma forma de reprocessar a linha e obter os valores dentro de $ var para executar a expansão do Brace é usar eval (não recomendado e não necessário neste caso):

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

É melhor se os números dos limites não tiverem zeros à esquerda, mas, se o fizerem, isso também os converterá.

A saída terá um zero à esquerda, conforme solicitado. E é controlado pelo único printf . Altere o 06 para 07 se você precisar de dois zeros.

#!/bin/bash

lowest=046725              highest=046899

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

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

Se você precisar do resultado em uma variável, use esta linha (e use var):

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

E uma versão 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
    
por 11.01.2016 / 08:22