Проблема с включением оператора if в скрипте bash - PullRequest
0 голосов
/ 30 ноября 2018

Я довольно новичок в скриптах bash.Ниже приведен мой bash-скрипт, и я хочу включить оператор if в месяц (ij==09) equals 09 then "i" should be from 01 to 30. Я пробовал несколько способов, но не сработал.

Как я могу включить оператор 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 голосов
/ 02 декабря 2018

Наименьшее изменение - добавление continue для дня 31 в месяце 9. Вы должны проверить «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.Вы не хотите использовать `for ((i = 1; i <= 31; i ++)) с учетом начальных нулей. <br>Также используйте подробные имена переменных.

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/')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...