BASH如果[[“$ a”== *“$ b”*]]即使它不应该也是如此

时间:2013-02-04 16:44:13

标签: linux bash shell

我正在尝试编写一个小的bash脚本来监视RiotShield(英雄联盟的第三方玩家刮刀)的输出。如果在日志中找到关键字,它应该终止进程并重新启动它。

这是我的bash脚本:

#!/bin/bash
crash[1]="disconnected"
crash[2]="38290209"
while true; do
    list=$(tail log.log)
    #clear
    echo "Reading Log"
    echo "========================================"
    echo $list
    for item in ${list//\\n/ }
    do
            for index in 1 2
            do
                    c=${crash[index]}
                    #echo "Crash Word:" $c
                    if [[ "$c" == *"$item"* ]]; then
                            echo "RiotShield has crashed."
                            echo "Killing RiotShield."
                            kill $(ps aux | grep '[R]iotShield.exe' | awk '{print $2}')
                            echo "RiotShield killed!"
                            echo "Clearing log."
                            echo > log.log
                            echo "Starting RiotShield"
                            (mono RiotShield.exe >> log.log &)

                    fi
            done

    done

    sleep 10
done

我的崩溃数组是我知道在崩溃时显示在日志中的关键字。我在那里只有38290209用于测试目的,因为它是我的英雄联盟上的召唤者ID,并且当我预先搜索我的召唤师名称时,ID显示在日志中。

问题是即使断开连接并且38290209没有显示在我的

日志中
if [[ "$c" == *"$item"* ]]; then
火灾,杀死RiotShield进程,然后重新启动它。

崩溃数组的长度会随着我找到更多关于崩溃的关键字而增长,所以我不能这样做

if [[ "$c" == "*disconnected*" ]]; then

请和谢谢SOF

编辑:

添加工作代码:

#!/bin/bash
crash[1]="disconnected"
crash[2]="error"
while true; do
    list=$(tail log.log)
    clear
    echo "Reading Log"
    echo "========================================"
    echo $list
    for index in 1 2
    do
            c=${crash[index]}
            #echo "Crash Word:" $c
            if [[ $list == *$c* ]]; then
                    echo "RiotShield has crashed."
                    echo "Crash Flag: " $c
                    echo "Killing RiotShield."
                    kill $(ps aux | grep '[R]iotShield.exe' | awk '{print $2}')
                    echo "RiotShield killed!"
                    echo "Clearing log."
                    echo > log.log
                    echo "Starting RiotShield"
                    (mono RiotShield.exe >> log.log &)
                    fi
            done
    sleep 10
done

1 个答案:

答案 0 :(得分:4)

我认为你的表达中的操作数是错误的。它应该是:

if [[ $item == *$c* ]]; then

因为您想查看行($c)中是否存在关键字($item)。

此外,我不确定为什么你需要通过这样做来突破这一行:${list//\\n/ }。你可以匹配整条线。

另请注意,[[中不需要双引号。