如果函数中的一个变量为空,则使用不同的参数重复函数

时间:2013-05-15 09:49:56

标签: bash function shell

该函数必须检查TARGET是否为空,如果它为空,我希望它重复,但这次是c1TIME=$hours:$minutes:[0-9][0-9] 然后运行它,如果它仍然是空的那么c1TIME=$hours:$c1minutes[0-9]:[0-9][0-9] 之后它应该停止并回显一些信息。

$1是带有错误的标准日志文件

$TIME此模式中的时间字符串HH:MM:SS 如果这令人困惑,我很抱歉,我很感激任何帮助

这个功能的作用是什么:
首先,它需要一个随机时间,例如12:34:56,只读 c1seconds中的“5”,然后c1TIME12:34:5[0-9]
Target现在尝试在日志文件中找到c1TIME字符串所在的行 打印行号 c1DATE更改了12:34:5[0-9]在找到的时间,例如12:34:56 其余的实际上并不重要

就像我上面说的TARGET为空时它必须再次运行,那么如何在执行函数时或之后检查TARGET?

  function check() {     
    c1seconds=`echo $TIME | awk '{print substr ($1,7,8)}' | head -1c`
    c1TIME=$hours:$minutes:$c1seconds[0-9]
    TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`
    c1DATE=`cat $1 | grep "$c1TIME" | grep -Eo "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}" | head -1`
    EXCEPTION=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Exception`
    ERROR=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Error`
    SEMAPHORE=`tail -$[$WINDOW_LINES-$TARGET]  $1| grep -c semaphore`
    echo $TARGET
    return 0
  }

2 个答案:

答案 0 :(得分:1)

你想重复while目标为空::)所以你走了:

function check() {

    c1seconds=`echo $TIME | awk '{print substr ($1,7,8)}' | head -1c`
    c1TIME=$hours:$minutes:$c1seconds[0-9]
    TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`

    if [ x$TARGET = x ] ; then
           c1TIME=$hours:$minutes:[0-9][0-9] 
           TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`
    fi

    c1DATE=`cat $1 | grep "$c1TIME" | grep -Eo "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}" | head -1`
    EXCEPTION=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Exception`
    ERROR=`tail -$[$WINDOW_LINES-$TARGET] $1 | grep -c Error`
    SEMAPHORE=`tail -$[$WINDOW_LINES-$TARGET]  $1| grep -c semaphore`
    echo $TARGET

}
BTW感觉就像一个丑陋的方式来做你正在做的事情:P

感觉更加丑陋:)但我不知道你想要完成什么或者你的输入是什么,所以答案是如上所述。

答案 1 :(得分:0)

你可以随时使用递归。在全局级别保持level=0并再次调用该函数。

level=0;
function check() {

现在而不是

c1TIME=$hours:$minutes:$c1seconds[0-9]

使用

if [ $level -eq 0 ]; then c1TIME=$hours:$minutes:$c1seconds[0-9]; fi
if [ $level -eq 1 ]; then c1TIME=$hours:$minutes:[0-9][0-9]; fi
if [ $level -eq 2 ]; then c1TIME=$hours:$c1minutes[0-9]:[0-9][0-9]; fi
if [ $level -ge 2 ]; then echo "ERROR"; exit; fi

现在而不是

TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`

使用

TARGET=`cat -n $1 | grep "$c1TIME" | awk '{printf "%s\n",$1}' | awk 'sub("$", "")'| head -1`
if [ "x$TARGET" = "x" ]; then ((level++)); check $@; fi

我没有运行这个,所以可能存在拼写错误,但主要思想是递归和检查的数量最多为3,使用简单的if检查递归的深度。您可以修改ifif else的系列。此外,如果grep可以打开文件,为什么cat file并管道,如果awk可以在文件中搜索模式,为什么cat file | grep pattern呢?