我正在使用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
;;
答案 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