【问题标题】:bash script: add two statements with binary operator in conditional statementbash脚本:在条件语句中添加两个带有二元运算符的语句
【发布时间】:2016-01-02 11:56:05
【问题描述】:

我有以下 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

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

【问题讨论】:

  • 我想你想要的是[[ $i &lt; 4 ]]
  • 喜欢if echo $LINE | grep 'Network connection down!' &amp;&amp; [[$i&lt;4]] ?
  • @lindsaymacvean:注意[[ ... ]]中的空格
  • 是的,但是在&lt; 周围加空格,这很重要
  • ...因为[[ i &lt; 4 ]] 不会做你想做的事情如果i=39

标签: bash shell binary-operators


【解决方案1】:

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! ]] &amp;&amp; (( i &lt; 4)),但您可能明白这一点)。

【讨论】:

  • 哎呀,对不起。忘了我们在谈论数字
  • 非常感谢。我的脚本使用[[ $i &lt;4 ]] 使用&lt; 而不是-lt 时是否需要(( 括号?
  • [[ ... ]]内部,-lt用于整数比较,&lt;用于字符串比较。在((...)) 内部,一切都是算术运算,因此&lt; 可用于整数比较,而不是-lt
【解决方案2】:

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

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

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

echo $LINE|grep -c 'Network connection down!' 

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2011-02-18
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多