在bash脚本中包含if语句的问题

时间:2018-11-30 20:15:59

标签: bash if-statement

我对bash脚本非常陌生。我下面有我的bash脚本,我想在月份(ij==09) equals 09 then "i" should be from 01 to 30时加入if语句。我尝试了几种方法,但没有用。

如何在下面的代码中包含if语句以完成任务?任何帮助表示赞赏。

谢谢。

#!/bin/bash
        for ii in 2007 
        do
        for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #Day of the Month
        do
        for ij in 09 10 # Month
        do
         for j in 0000 0100 0200 0300 0400 0500 0600 0700 0800 0900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300
         do
         cdo cat DAS_0125_H.A${ii}${ij}${i}.${j}.002_var.nc outfile_${ii}${ij}${i}.nc
         done
        done
        done
        done

1 个答案:

答案 0 :(得分:0)

最小的变化是在第9个月的第31天添加continue。 您必须将“ 09”作为字符串(或作为10#09)进行测试。
(我也将cdo ...更改为echo cdo ...

for ii in 2007
do
   for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #Day of the Month
   do
      for ij in 09 10 # Month
      do
         if [[ "${ij}" == "09" ]] && [[ "${i}" == "31" ]]; then continue; fi
         for j in 0000 0100 0200 0300 0400 0500 0600 0700 0800 0900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300
         do
            echo "cdo cat DAS_0125_H.A${ii}${ij}${i}.${j}.002_var.nc outfile_${ii}${ij}${i}.nc"
         done
      done
   done
done

当您使用带有seq的变量时,更容易阅读。考虑到前导零,您不希望对((i = 1; i <= 31; i ++))使用`。
还请使用详细的变量名。

for year in 2007
do
   for day in {01..31} # Day of the Month
   do
      for month in {09,10} # Month
      do
         if [[ "${month}" == "09" ]] && [[ "${day}" == "31" ]]; then continue; fi
         for hour in {00..23}
         do
            echo cdo cat DAS_0125_H.A${year}${month}${day}.${hour}00.002_var.nc outfile_${year}${month}${day}.nc
         done
      done
   done
done

文件已经存在时,您可以考虑

ls DAS_0125_H.A2007{09,10}{01..31}.{00..23}00.002_var.nc |
   sed -r 's/.*([0-9]{8})/cdo cat & outfile_\1.nc/'

当这将显示所需的命令时,您可以通过以下方式执行它们

source <(ls DAS_0125_H.A2007{09,10}{01..31}.{00..23}00.002_var.nc |
   sed -r 's/.*([0-9]{8})/cdo cat & outfile_\1.nc/')