Bash带有两个字符串条件的while循环

6

我遇到了一个bash脚本的问题。我的脚本启动了一个需要一些时间才能启动的服务器。为了应对长时间的启动,我加入了一个while循环来查询服务器是否已经运行。

while [ $running -eq 0 ]; do
echo "===" $response "===";
if [ "$response" == "" ] || [ "$response" == *"404 Not Found"* ]; then
    sleep 1;
    response=$(curl $ip:4502/libs/granite/core/content/login.html);
else
   running=1;
fi
done

当退出循环时,$response等于字符串"404"。如果是这种情况,那么这个事物应该仍然在循环中,不是吗?似乎我的循环提前退出了。
2个回答

6

[ .. ]在通配符匹配中无法匹配。请使用[[ .. ]]

if [ "$response" == "" ] || [[ "$response" == *"404 Not Found"* ]]; then

请注意,[[ ]] 是 Bash 的扩展功能,因此请确保脚本以 #!/bin/bash 开头,而不是 #!/bin/sh。虽然有一些在纯 POSIX shell 语法中进行等效测试的方法,但它们并不像使用 [[ ]] 那样简洁明了。 - Gordon Davisson
谢谢您的回答,但即使按照您的更改进行,我仍然看到循环在响应包含404字符串时退出。 - Joe Andolina
@JoeAndolina 只是一个想法 - 你是否已经在另一个明确给出404的网站上进行了验证? - Preet Sangha
@Preet,我的循环输出被 === 包围,循环后的输出被 +++ 包围,=== <html><head><title> 404 Not Found </title>... ===,
  • after -
+++ <html><head><title> 404 Not Found </title>... +++,
- Joe Andolina
@JoeAndolina,你的echo语句破坏了空格,因此如果文本包含两个空格或不间断空格,它将打印相同但不匹配。使用带引号的echo "$response" > file可以让你进行调查。 - that other guy
@thatotherguy 再次感谢您的回复。服务器输出了多个响应,经过查看回显输出,我发现输出中有换行符和其他我没有考虑到的内容。由于我需要跟踪4种不同的输出字符串长度,因此下面的解决方案更适合这种情况。 - Joe Andolina

0

我不确定为什么我的原始脚本失败了。我猜测这可能是因为我在与HTML进行比较。为了让我的脚本正常工作,我最终使用了字符串长度而不是内容进行比较。使用以下比较器后一切都正常运行。

if [ -z "$response" ] || [ ${#response} -lt 100 ]; then

感谢您的帮助, 乔


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