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

4

我刚开始学习PHP。我正在跟随phpacademy的教程,我会向任何人推荐它。无论如何,我正在使用XAMPP来测试我的脚本。我正在尝试编写一个bash脚本,它将启动XAMPP,如果发现从终端重定向到文件xampp.log的特定字符串“XAMPP for Linux started。”,则会打开Firefox到本地主机页面。我在搜索文件时遇到了问题。我一直得到一个:

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

调试的标准技巧是使用 set -vx 或将 shebang 更改为 #!/bin/bash -x 并检查是否按预期展开了所有内容。 - Fredrik Pihl
3个回答

6
在shell脚本中,不应该直接写$variable,因为这会对变量的值进行单词扩展。在您的情况下,这将产生四个单词。
始终使用引号包围变量,例如:
grep -e "$string" file...
< p > -e 是必需的,当字符串可能以破折号开头时,并且在字符串周围加上引号使其成为一个单词。

顺便说一下:编写shell程序时,第一行应该是set -eu。这启用*e*rror检查并检查*u*未定义的变量,在您的情况下将非常有用。有关更多详细信息,请阅读Bash手册。


1

如果你正在搜索一个字符串,你应该将其放在引号中。
尝试使用"$string"而不是$string


1

有几个问题:

  • 如果想将变量作为简单参数传递,则需要引用变量"$string"
  • 没有$true$false
  • Bash进行变量扩展,它在执行命令之前用它们的值替换变量名。因此,$loaded=$true应该是loaded=true
  • 在if语句中需要加空格和引号:if [$loaded -eq $true]if [ "$loaded" -eq true ]。在这种情况下,变量已经设置,因此不会引起问题,但一般情况下不能依赖于此。

“test foo -eq bar” 不是用来进行数字比较的吗? - Roland Illig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接