在 bash 中将索引号附加到变量名吗?

在 bash 中将索引号附加到变量名吗?

我正在尝试循环遍历编号变量,但很难将循环索引号附加到基本变量名称。代码如下,使用 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

第一个问题是,您询问的问题与您遇到的问题不同......

首先给出一个非常直白的答案:如果你想访问一个变量,而这个变量的名称在另一个变量中,那么你可以使用“间接扩展”——${!...}运算符。例如:

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

这里表示十进制数(在 C 语言中和%d之间的区别很重要,但在 bash 中它们几乎可以互换)。将使其至少长 2 个字符并右对齐(使用负宽度左对齐);使其用零填充而不是用空格填充。%d%s%2d%02d

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

相关内容