我刚开始学习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
答案 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
$loaded=$true
应为loaded=true.
if [$loaded -eq $true]
if [ "$loaded" -eq true ]
中需要空格和引号。在这种情况下,变量设置为不会引起问题,但通常不依赖于此。