如果没有其他

时间:2018-12-18 22:33:53

标签: bash grep

我正在使用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并根据用户为MONTH输入的内容使用所需的grep。

我尝试过

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 ;;

但是我得到了关于fi的错误 我已经尝试过移动那个fi,但我似乎无法弄清我所缺少的。

基本上我想在变量中寻找一个数字,如果它有一个 在基本变量$ MONTH上运行grep

如果没有数字,我想在变量前加一个破折号
'-'$ 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 :(得分:0)

(我认为)您正在尝试做什么:

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而不是{{1 }},每个子句中都有一个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 ;; -不需要额外的管道)。 / p>

*证明您正在尝试的方法实际上可以工作,尽管我个人认为这不是很简洁。示例:

cat