гтопс если иное - PullRequest
       7

гтопс если иное

0 голосов
/ 19 декабря 2018

У меня есть рабочая функция getops

m) MONTH=$OPTARG
                  for file in *eqllogmgr* ;
                  do ftx $file |
                  layoutcc ;
            cat $file | grep '\-'$MONTH |
            perl -ne 'print if /-2018/' |
            perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' |
                    sed '$d' ;
                    echo ;
                    ft1 ;
                    done ;;

Я пытаюсь изменить grep для оценки $ MONTH и использовать нужный мне grep в зависимости от того, что пользователь вводит для MONTH.

Я попробовал это

t) MONTH=$OPTARG

 if [[ $MONTH =~ ^[0-9]+$ ]]; then
    for file in *eqllogmgr* ;
    do ftx $file | 
    layoutcc ;
               cat $file | grep $MONTH |
               perl -ne 'print if /-2018/' |
               perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' |
                             sed '$d' ;
                             echo ;
                             ft1 ;
                             fi ;
                             done ;;

  else
    for file in *eqllogmgr* ;
    do ftx $file | 
    layoutcc ;
                cat $file | grep '\-'$MONTH |
                perl -ne 'print if /-2018/' |
                perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' |
                               sed '$d' ;
                               echo ;
                               ft1 ;
                               fi ;
                               done ;;

Но я получаю ошибки для файла, который я пытался переместить, и я не могу понять, чего мне не хватает.

В основном я хочу найти число в переменной, и если оно имеет один, запустите grep для базовой переменной $ MONTH

Если у него нет номера, я хочу отобразить переменную с дефисом перед ним
'-' $ MONTH

Я тоже это устал и получаю ту же синтаксическую ошибку рядом с неожиданным токеном else, так что я почти уверен, что я использую оператор if else

u) MONTH=$OPTARG
for file in *eqllogmgr* ;
                     do ftx $file |
                             layoutcc ;
                     cat $file | 
                    if [[ $MONTH =~ ^[0-9]+$ ]]; then
                    grep $MONTH |
                    else
                    grep '\-'$MONTH |
                    fi
        perl -ne 'print if /-2018/' |
        perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' |
                sed '$d' ;
                     echo ;
                     ft1 ;
                     done ;;

Добавление моей окончательной рабочей версии для справки ==========================

m) MONTH=$OPTARG

        if [[ "$MONTH" = [0-9]* ]]; then
            grep_expr=$MONTH
        else
            grep_expr='\-'$MONTH
        fi

   for file in *eqllogmgr* ; do
     ftx "$file" | layoutcc
     grep "$grep_expr" "$file" | perl -ne 'print if /-2018/' | perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' | sed '$d'
     echo
     ft1
   done 

   ;;

1 Ответ

0 голосов
/ 19 декабря 2018

Что (я думаю) вы пытаетесь сделать:

case-value)
  if ... ; then
    for ...; do
    done
  else
    for ...; do
    done
  fi
  ;;

Что вы показали в своем вопросе:

case-value)
  if ...; then
    for ...; do
      fi
    done
    ;;
  else
    for ...; do
      fi
    done
    ;;

Первый fi и первый ;; оба посторонние.Второй fi неуместен во втором цикле for.

В редактировании, которое вы внесли в свой вопрос, вы, похоже, изменили тактику и теперь пытаетесь достичь своей цели одним forцикл, содержащий if/else, в отличие от if/else с циклом for в каждом предложении.Это определенно более эффективно, , но вы не можете использовать if/else так, как вы пытаетесь.По крайней мере, не без лишней путаницы (на самом деле вы можете, но вам нужно избавиться от пары лишних | с - см. Ниже).Поскольку ваше grep выражение изменяется только на пару символов, вы можете просто сохранить выражение в переменной и использовать ваше if/else для установки выражения:

u) MONTH=$OPTARG

   if [[ "$MONTH" =~ ^[0-9]+$ ]]; then
     grep_expr='\-'$MONTH
   else
     grep_expr=$MONTH
   fi

   for file in *eqllogmgr* ; do
     ftx "$file" | layoutcc
     grep "$grep_expr" "$file" |
        perl -ne 'print if /-2018/' |
        perl -pe 's/......-2018/\e[1;32m$&\e[0m/g' |
        sed '$d'
     echo
     ft1
   done 

   ;;

Примечание: я также добавил некоторые цитатыудалил ненужные двоеточия и избавился от ненужной команды cat (просто передайте имя файла непосредственно grep - нет необходимости в дополнительной трубе).

* Оказывается, что вы пытались бы на самом делеработать, хотя лично я не думаю, что это очень кратко.Пример:

$ show=men
$ echo -e "Alice\nBob\nCarol\nDavid" | if [[ "$show" = "men" ]]; then egrep 'Bob|David'; else egrep 'Alice|Carol'; fi
Bob
David

$ show=women
$ echo -e "Alice\nBob\nCarol\nDavid" | if [[ "$show" = "men" ]]; then egrep 'Bob|David'; else egrep 'Alice|Carol'; fi
Alice
Carol
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...