Я пытаюсь перебрать пронумерованные переменные, но мне трудно добавить индексный номер цикла к имени базовой переменной. Код следует, используя 2-итерационный пример:

#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;

Затем я пытаюсь пройтись по циклу так, чтобы я мог добавить номер прогона к имени базовой переменной, единственное, что осталось прежним (например, добавив 1,2,3..etc к yr и затем вызвав $ yr1 $ yr2 переменные $ yr3 ... и т.д., как определено выше)

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))

Сейчас я пытаюсь создать строки, которые я использую для замены в программный файл, но из-за вышеуказанных проблем я получаю следующее:

    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

Будем очень благодарны любой помощи. Спасибо!

1 ответ1

0

Первая проблема заключается в том, что вы спрашиваете о проблеме, отличной от той, которая у вас возникает ...

Начнем с очень буквального ответа: если вы хотите получить доступ к переменной, имя которой находится в другой переменной, вы можете использовать "косвенное расширение" - оператор ${!...} . Например:

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

Однако то, что вы делаете, добавляя индексный номер к именам переменных, просто неэффективно эмулирует переменную массива, даже если bash уже имеет массивы как встроенный тип данных:

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

(Вы также можете перебрать все «ключи», используя for i in ${!yr[@]} .)

Наконец, просто для ответа на последний пример: если вы хотите обнулить числа, вы можете использовать команду printf со строками формата, подобными тем, что в 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

Здесь %d означает десятичное число (различие между %d и %s важно в C, но они почти взаимозаменяемы в bash). %2d сделает его длиной не менее 2 символов и выровненным по правому краю (используйте отрицательную ширину для выравнивания по левому краю); %02d делает его заполненным нулями, а не пробелом.

printf "[%d] [%-4d] [%03d]\n" 1 2 3      # -> [1] [2   ] [003]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .