linux shell脚本if else语句

时间:2014-05-06 04:25:50

标签: shell

[root@linux ~]# cat show-spans | grep Down
PRI span 1/0: In Alarm, Down, Active
PRI span 3/0: In Alarm, Down, Active
PRI span 4/0: In Alarm, Down, Active

即时指定grep仅跨越1&在命令下方的2下方找到

[root@samba ~]# cat show-spans | grep -e 1 -e 2 | grep Down
PRI span 1/0: In Alarm, Down, Active

我想写别的状态

如果在使用grep命令电子邮件提醒时发现单词“Down”,或者不发送电子邮件

我正在使用ssmtp进行电子邮件提醒,如下所示

cat show-spans | grep -e 1 -e 2 | grep Down| mail -s "Test email alert" indiaxxx@gmail.com

我想把它作为脚本。请帮助。

1 个答案:

答案 0 :(得分:0)

我可以很快看到至少3个选项。

  1. 显而易见的临时文件:

    F=$(mktemp)
    if cat show-spans | grep Down >"$F"; then
        mail -s "Test email alert" indiaxxx@gmail.com <"$F"
    fi
    rm -f "$F"
    

    缺点是它会创建一个临时文件。这完全没必要。

  2. 如果文字不长(我猜它不会),使用变量代替文件:

    TEXT=$(cat show-spans | grep Down)
    if [ -n "$TEXT" ]; then
        printf "%s\n" "$TEXT" | mail -s "Test email alert" indiaxxx@gmail.com
    fi
    

    (或者if可以测试[ 0 = $? ]; grep总是会在找到的时候打印一些东西,如果没找到则没有,所以测试非空输出或grep退出状态是等效的。

    请注意,该命令替换会删除尾随空白区域,但除此之外它会保留所有字符(包括换行符),因此使用多行。

    printf命令比echo更可靠,因为echo解释了一些转义序列,并且存在互不兼容的实现。 printf仅解释第一个参数中的转义。

  3. 对于仍然没有临时文件的大输入:

    cat show-spans | grep Down | {
        if read FIRST; then
            {
                 printf "%s\n" "$FIRST"
                 cat
            } | mail -s "Test email alert" indiaxxx@gmail.com
       fi
    }
    

    read将尝试读取grep输出的第一行,如果成功,则重新打印,其余的通过cat直接复制到mailread应该是read -r,以避免解释转义序列如果你的shell支持它。