0

我有以下 bash 脚本

i=1
while SH= read -r LINE
    do
        if echo $LINE | grep 'Network connection down!'
        then 
            echo "shutdown"
            exit
    elif echo $LINE | grep 'Network connection available'
    then
        echo $LINE
        ((i++))
    fi

done < <(tac /var/log/messages)

到目前为止,该脚本有效。我不是 shell 脚本专家。我正在尝试在第一个条件语句中添加一个 and 运算符,就像这样

if echo $LINE | grep 'Network connection down!' && $i<4

任何人都可以帮我展示如何在 shell 脚本中进行这项工作,到目前为止我尝试过的每个变体都以各种错误结束,例如

conditional binary operator expected

以及我可以描述的其他各种。非常感谢大家提前:)

4

2 回答 2

4

Shell 编程需要一个特殊的命令来执行比较,因为if语句本身不适用于表达式,只能使用命令。在bash中,要使用的命令是条件命令,[[ ... ]]

if echo "$line" | grep 'Network connection down!' && [[ $i -lt 4 ]]; then

您也可以使用算术命令(( ... )),它允许更熟悉的表达式:

if echo "$line" | grep 'Network connection down!' && (( i < 4 )); then

您还可以将呼叫替换grep=~操作员:

if [[ $line =~ Network\ connection\ down! && $i -lt 4 ]]; then

(或[[ $line =~ Network \connection \down! ]] && (( i < 4)),但你可能明白了)。

于 2015-10-05T18:29:26.247 回答
0

“if”行可以这样写。我已经将“<”更改为“-lt”,因为“<”和“>”应该与字符串一起使用,而 -lt、-gt、-eq 和其他更适合数字。

if [[ `echo $LINE|grep -c 'Network connection down!'` -eq 1 && $i -gt 4 ]]

这部分的执行计算带有文本“网络连接中断!”的行数,始终为 1 或 0。然后将此结果与一 (1)

echo $LINE|grep -c 'Network connection down!' 
于 2015-10-05T18:55:03.103 回答