Anexa um número de índice a um nome de variável no bash?

0

Eu estou tentando percorrer as variáveis numeradas, mas estou tendo dificuldade em anexar o número do índice do loop ao nome da variável base. Código segue, usando um exemplo de 2 iterações:

#ENTER TOTAL NUMBER OF RUNS HERE:
nruns=2

# START DATE/TIME              #END DATE/TIME
#*****************             ***************
#RUN 1          #RUN 2         #RUN 1              #RUN2
yr1=2008;       yr2=2008;      eyr1=2008;          eyr2=2008;
mo1=11;         mo2=12;        emo1=12;            emo2=12;
day1=30;        day2=1;        eday1=2;            eday2=3;
hr1=18;         hr2=18;        ehr1=00;            ehr2=00;
min1=00;        min2=00;       emin1=00;           emin2=00;
sec1=00;        sec2=00;       esec1=00;           esec2=00;

Então eu tento fazer um loop de tal forma que eu possa acrescentar o número de execução ao nome da variável base, que é a única coisa que permanece a mesma (por exemplo, anexando 1,2,3..etc ao ano e chamando o $ yr1 $ yr2 $ yr3 ... etc variáveis como definido acima)

for count in 'seq 1 $nruns'
do
    #start vars
    #**********
    ystart=$((yr$count))  
    mostart=$((mo$count)) 
    daystart=$((day$count))
    hrst=$((hr$count)) # but this removes my preceding 0 which I need. i.e, 
                       # here I get 0 instead of 00
    minst=$((min$count))
    secst=$((sec$count))

    # Similarly, for end time variables
    #end vars
    #**********
    yend=$((eyr$count))
    moend=$((emo$count))
    dayend=$((eday$count))
    hrend=$((ehr$count))
    minend=$((emin$count))
    secend=$((esec$count))

Agora, tento criar strings que estou usando para substituir em um arquivo de programa, mas, devido aos problemas acima, recebo o seguinte:

    sd1=$ystart-$mostart-$daystart\_$hrst:$minst:$secst
 #which gives me 2008-11-30_18:0:0 instead of 2008-11-30_18:00:00

    ed1=$yend-$moend-$dayend\_$hrend:$minend:$secend
 #which gives me 2008-12-2_0:0:0 instead of 2008-12-02_00:00:00

Qualquer ajuda seria muito apreciada. Obrigada!

    
por user321528 09.05.2014 / 00:57

1 resposta

0

O primeiro problema é que você está perguntando sobre um problema diferente daquele que você está tendo ...

Para começar com uma resposta muito literal: Se você deseja acessar uma variável cujo nome está em outra variável, é possível usar "expansão indireta" - o operador ${!...} . Por exemplo:

var=yr$i; ystart=${!var}
var=mo$i; mostart=${!var}
...

No entanto, o que você está fazendo ao anexar um número de índice a nomes de variáveis é apenas emular ineficientemente uma variável de matriz , mesmo que o bash já tenha arrays como um tipo de dados interno:

yr=()   # declare 'yr' to be an empty array
mo=()

yr[1]=2008
mo[1]=11

yr[2]=2009
mo[2]=01

for (( i=1; i <= nruns; i++ )); do

    echo "Date: ${yr[i]}-${mo[i]}-${day[i]}"

done

(Você também pode iterar em todas as 'chaves' usando for i in ${!yr[@]} .)

Finalmente, apenas para responder ao último exemplo: Se você quiser zerar os números dos pads, você pode usar o comando printf com strings de formato similares àquelas em C:

yr=2009
mo=4
day=7
hr=11
min=5

printf "%d-%02d-%02d %02d:%02d\n" $yr $mo $day $hr $min
# -> 2009-04-07 11:05

Aqui %d significa um número decimal (a distinção entre %d e %s é importante em C, mas eles são quase intercambiáveis no bash). %2d terá pelo menos 2 caracteres de comprimento e alinhamento à direita (use largura negativa para alinhar à esquerda); %02d torna zero preenchido em vez de preenchido com espaço.

printf "[%d] [%-4d] [%03d]\n" 1 2 3      # -> [1] [2   ] [003]
    
por 09.05.2014 / 02:00

Tags