在 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
我有一个 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