数组和循环中的Bash参数替换

时间:2017-08-11 09:49:02

标签: arrays bash

这里有新的Bash用户。我试图从略有不同的URL下载大量的grib2文件来绘制天气模型中的数据。为此,我尝试使用嵌套for循环来模拟嵌套数组(因为bash不支持多维数组),使用"外部"数组描述某个大气变量的水平和'#34;内部"描述该级别大气变量的数组。

我的第一个问题是声明描述大气变量的数组。当我打电话给" echo $ {VAR $ {LEV [0]}}"时,我得到一个"糟糕的替代"错误。

declare -a LEV=("500_mb" "300_mb")
eval "declare -a VAR${LEV[0]}=("hgt" "abs" "ugrd" "vgrd")"
eval "declare -a VAR${LEV[1]}=("hgt" "tmp" "ugrd" "vgrd")" 

我在嵌套的for循环中遇到了类似的问题并得到了一个"错误的替换"错误$ {#VAR $ {LEV [i]} [@]}。

for ((i=0;i<${#LEV[@]};i++)); do
        for ((j=0;j<${#VAR${LEV[i]}[@]};j++)) do
            GRIBFILE="/home/mint/opengrads/Contents/gribfiles/${MODEL}/${INIT_INTDATE}${INITHOUR}/${INIT_INTDATE}${INITHOUR}_${FORECASTHOUR}_${LEV[i]}_${VAR[j]}"
            CTLFILE="/home/mint/opengrads/Contents/controlfiles/${MODEL}/${INIT_INTDATE}${INITHOUR}/${INIT_INTDATE}${INITHOUR}_${FORECASTHOUR}_${LEV[i]}_${VAR[j]}.ctl"
            URL="http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=gfs.t${INITHOUR}z.pgrb2.0p25.f${FORECASTHOUR}&lev_${LEV[i]}=on&var_${VAR[j]}=on&leftlon=0&rightlon=360&toplat=90&bottomlat=-90&dir=%2Fgfs.${INIT_INTDATE}${INITHOUR}"  
            wget -O $GRIBFILE $URL 
            create_control $GRIBFILE $CTLFILE
        done
   done

我想知道是否有人知道如何修复这些错误,或者可以建议更好的方法来实现优雅下载所有这些文件的理想方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

您始终可以使用一维数组模拟二维数组,例如:

rows=3
cols=5
arr=(
    a b c d e
    f g h i j
    k l m n o
)

for ((i = 0; i < rows; i++)); do
    for ((j = 0; j < cols; j++)); do
        ((index = i * cols + j))
        printf "%s " ${arr[index]}
    done
    echo
done

打印:

a b c d e
f g h i j
k l m n o

即使arr是一维的。 关键是根据indexi以及每行的列数来计算j

如果您的二维数组是不规则的(并非所有行都具有相同的列), 那么你可以使用应该跳过的指定虚拟值, 例如:

rows=3
cols=5
d=-
arr=(
    a b c d  e
    f g h $d $d
    k l m n  $d
)

for ((i = 0; i < rows; i++)); do
    for ((j = 0; j < cols; j++)); do
        ((index = i * cols + j))
        [[ ${arr[index]} != "$d" ]] || continue
        printf "%s " ${arr[index]}
    done
    echo
done

打印:

a b c d e
f g h
k l m n

基于以上内容,以及其他一些改进,您可以像这样重写脚本:

LEV=(500_mb 300_mb)
VAR=(
  hgt abs ugrd vgrd
  hgt tmp ugrd vgrd
)
rows=2
cols=4

for ((i = 0; i < rows; i++)); do
    for ((j = 0; j < cols; j++)); do
        ((index = i * cols + j))
        GRIBFILE="/home/mint/opengrads/Contents/gribfiles/${MODEL}/${INIT_INTDATE}${INITHOUR}/${INIT_INTDATE}${INITHOUR}_${FORECASTHOUR}_${LEV[i]}_${VAR[index]}"
        CTLFILE="/home/mint/opengrads/Contents/controlfiles/${MODEL}/${INIT_INTDATE}${INITHOUR}/${INIT_INTDATE}${INITHOUR}_${FORECASTHOUR}_${LEV[i]}_${VAR[index]}.ctl"
        URL="http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file=gfs.t${INITHOUR}z.pgrb2.0p25.f${FORECASTHOUR}&lev_${LEV[i]}=on&var_${VAR[index]}=on&leftlon=0&rightlon=360&toplat=90&bottomlat=-90&dir=%2Fgfs.${INIT_INTDATE}${INITHOUR}"  
        wget -O $GRIBFILE $URL 
        create_control $GRIBFILE $CTLFILE
    done
done