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