这里有新的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
我想知道是否有人知道如何修复这些错误,或者可以建议更好的方法来实现优雅下载所有这些文件的理想方法。
谢谢!
答案 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
是一维的。
关键是根据index
,i
以及每行的列数来计算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