2017-08-11 45 views
0

新的Bash用戶在這裏。我試圖從略微不同的網址下載一大堆grib2文件來繪製天氣模型的數據。爲此,我試圖使用嵌套for循環來模擬嵌套數組(因爲bash不支持多維數組),「外部」數組描述特定大氣變量的水平,「內部」數組描述該級別的大氣變量。陣列和循環中的Bash參數替換

我的第一個問題是聲明數組描述大氣變量。當我調用「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

你最好使用像python這樣的語言。 Bash不適合這類問題。 – Robo

回答

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是一維的。 關鍵是根據i,j和每行的列數計算index

如果你的二維數組褸(不是所有行具有相同的列), 那麼你可以使用應跳過指定的虛擬值, 例如:

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