在 bash 中有没有更有效的方法来编写这个 for 循环?

Is there a more efficient way to write this for loop in bash?

我有一个 for 循环,可以下载气候数据并将其裁剪到我的研究区域范围内。从技术上讲它是可行的,但我想知道是否有比让循环反复尝试创建目录更有效的方法。

我正在考虑将这个循环嵌套在一个循环中,该循环从一个数组中调用一个变量并为其创建一个目录,然后运行 ​​gdal...但我不确定这将如何工作,因为 gdal 行略有不同。

## INITIAL LOOP
for MM in 01 02 03 04 05 06 07 08 09 10 11 12 ; do 
    #download tmin data
    mkdir tmin
    cd tmin
    gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9  /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/tmin/CHELSA_tmin10_${MM}_1979-2013_V1.2_land.tif  CHELSA_tmin10_${MM}_1979-2013_V1.2_land_crop.tif 
    cd ..
    #download precpitation data
    mkdir prec
    cd prec
    gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9  /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/prec/CHELSA_prec_${MM}_V1.2_land.tif  CHELSA_prec_${MM}_V1.2_land_crop.tif 
    cd ..
    #download tmax data
    mkdir tmax
    cd tmax
    gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9     /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/tmax/CHELSA_tmax10_${MM}_1979-2013_V1.2_land.tif CHELSA_tmax10_${MM}_1979-2013_V1.2_land_crop.tif 
    cd ..
done
#THOUGHTS
var_list=(tmin tmax prec) 

for var in ${var_list[@]} ; do
    mkdir $var
    cd $var
    for MM in 01 02 03 04 05 06 07 08 09 10 11 12 ; do 
        #download tmin data
        mkdir tmin
        cd tmin
        gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9  /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/tmin/CHELSA_tmin10_${MM}_1979-2013_V1.2_land.tif  CHELSA_tmin10_${MM}_1979-2013_V1.2_land_crop.tif 
        cd ..
        #download precpitation data
        mkdir prec
        cd prec
        gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9  /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/prec/CHELSA_prec_${MM}_V1.2_land.tif  CHELSA_prec_${MM}_V1.2_land_crop.tif 
        cd ..
        #download tmax data
        mkdir tmax
        cd tmax
        gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9     /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/tmax/CHELSA_tmax10_${MM}_1979-2013_V1.2_land.tif CHELSA_tmax10_${MM}_1979-2013_V1.2_land_crop.tif 
        cd ..
    done
done

假设 gdal_translate 调用的最后一个参数是您希望创建的文件,并假设此参数可以包含到所述文件(待创建)的相对路径,如何:

mkdir -p tmin tmax prec           # '-p' suppresses the 'directory already exists' message

for MM in {01..12}
do
    # no ned for 'cd' calls if gdal_translate can write to a relative path/file, eg:

    gdal_translate ... tmin/CHELSA_tmin10_${MM}_1979-2013_V1.2_land_crop.tif 
    gdal_translate ... prec/CHELSA_prec_${MM}_V1.2_land_crop.tif 
    gdal_translate ... tmax/CHELSA_tmax10_${MM}_1979-2013_V1.2_land_crop.tif 
done

您的原始代码具有与此相同的效果:

var_list=(tmin tmax prec)

# make a hash array to hold tif files, with ${MM} to be eval'ed later:
declare -A xhash
xhash[tmin]="CHELSA_tmin10_${MM}_1979-2013_V1.2_land_crop.tif"
xhash[tmax]="CHELSA_tmax10_${MM}_1979-2013_V1.2_land_crop.tif"
xhash[prec]="CHELSA_prec_${MM}_V1.2_land_crop.tif"

for var in ${var_list[@]} ; do

    mkdir $var
    cd $var

    for MM in 01 02 03 04 05 06 07 08 09 10 11 12 ; do
        eval "tif=${xhash[$var]}"
        gdal_translate -projwin $ulx $uly $lrx $lry -co COMPRESS=DEFLATE -co ZLEVEL=9  /vsicurl/https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/${var}/$tif $tif
    done

    cd ..

done