【问题标题】:Bash while loop with two string conditions带有两个字符串条件的 Bash while 循环
【发布时间】:2013-07-06 10:48:59
【问题描述】:

我的 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”字符串。如果是这样的话,事情应该还在循环中,不是吗?似乎我的循环过早退出了。

【问题讨论】:

    标签: bash shell while-loop


    【解决方案1】:

    我不确定为什么我的原始脚本失败了。我认为这与我与 HTML 进行比较的事实有关。为了让我的脚本正常工作,我最终使用了字符串长度而不是内容。使用以下比较器使一切正常运行。

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

    感谢您的帮助, 乔

    【讨论】:

      【解决方案2】:

      [ .. ] 与 glob 不匹配。使用[[ .. ]]

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

      【讨论】:

      • 请注意,[[ ]] 是一个 bash 扩展,因此请确保脚本以 #!/bin/bash 开头,而不是 #!/bin/sh。有一些方法可以用普通的 POSIX shell 语法进行等效测试,但它们并不那么干净。
      • 感谢您的回答,但即使您进行了更改,我仍然看到循环退出,而响应中包含 404 字符串。
      • @JoeAndolina 只是一个想法 - 您是否已通过另一个肯定给出 404 的网站验证了这一点?
      • @Preet,我在循环中的输出用 === 包围,循环后的输出用 +++ 包围,@ 987654327@, - 之后 - +++ <html><head><title> 404 Not Found </title>... +++,
      • @JoeAndolina 您的 echo 语句破坏了空格,所以如果文本包含例如两个空格或一个不间断空格,它将打印相同但不匹配。 echo "$response" > file 带引号可以让您进行调查。
      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 2020-12-30
      • 2018-06-03
      • 2022-01-26
      • 2018-01-15
      • 2015-01-19
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多