使用bash脚本搜索日志文件中的字符串

时间:2011-09-17 21:24:51

标签: string bash grep

我刚开始学习PHP。我正在关注我推荐给任何人的phpacademy's教程。无论如何,我正在使用XAMPP来测试我的脚本。我正在尝试编写一个bash脚本,它将启动XAMPP然后将firefox打开到localhost页面,如果它找到一个特定的字符串,“XAMPP for Linux started。”,它已经从终端重定向到文件xampp.log。我在搜索文件时遇到问题。我一直得到:

grep: for: No such file or directory

我知道文件存在,我认为我的语法错了。这是我到目前为止所得到的:

loaded=$false
string="XAMPP for Linux started."

echo "Starting Xampp..."

sudo /opt/lampp/lampp start 2>&1 > ~/Documents/xampp.log

sleep 15

if grep -q $string ~/Documents/xampp.log; then

    $loaded=$true
    echo -e "\nXampp successfully started!"

fi

if [$loaded -eq $true]; then

    echo -e "Opening localhost..."
    firefox "http://localhost/"

else

    echo -e "\nXampp failed to start."
    echo -e "\nHere's what went wrong:\n"
    cat ~/Documents/xampp.log

fi

3 个答案:

答案 0 :(得分:4)

在shell脚本中,您不应该编写$variable,因为这将对变量的值进行字扩展。在你的情况下,它会产生四个字。

始终在变量周围使用引号,如下所示:

grep -e "$string" file...

当字符串可能以短划线开头时,-e是必需的,字符串周围的引号将其保留为一个字。

顺便说一下:当你编写shell程序时,第一行应该是set -eu。这样可以* e * rror检查并检查* u * ndefined变量,这对您的情况很有用。有关更多详细信息,请阅读Bash手册。

答案 1 :(得分:1)

您正在搜索应放在引号内的字符串。
请尝试使用"$string"代替$string

答案 2 :(得分:1)

有几个问题:

  • 引用变量,如果您想将它们作为简单参数"$string"
  • 传递
  • 没有$true$false
  • bash执行变量扩展,它在执行命令之前用变量名替换它们的值。 $loaded=$true应为loaded=true.
  • if if [$loaded -eq $true] if [ "$loaded" -eq true ]中需要空格和引号。在这种情况下,变量设置为不会引起问题,但通常不依赖于此。