Shell 语法错误:“虽然:找不到命令”

Posted

技术标签:

【中文标题】Shell 语法错误:“虽然:找不到命令”【英文标题】:Shell Syntax error: 'While: command not found' 【发布时间】:2019-08-19 10:03:28 【问题描述】:

下面的代码-sn-p 检查instance_status 是否可用。如果可用,请等待 15 秒,如果并回显实例状态。

我收到以下错误:

第 38 行:虽然:找不到命令

代码:

While ["$INSTANCE_STATUS" -eq "available"] 
do
  wait 15
  if $INSTANCE_STATUS" -ne "available"
  then 
    echo "$SOURCE_INSTANCE_ID" is "$INSTANCE_STATUS"
  fi
done

【问题讨论】:

你应该看看shellcheck.net。 试试while(小写) ...虽然这里也有其他错误([s 周围缺少空格,使用-ne 进行字符串而不是数字比较,缺少test 运算符用于比较“可用”等),这并不能使问题符合我们的准则 - 相反,每个问题有多个错误会使其“过于宽泛”。 Why should there be a space after [ and before ] in bash?; How to compare strings in bash? 还要注意wait 15不是等待15秒,而是等待ID为15的进程退出;你可能想要sleep 15。即使您实际监控的任何程序的状态在这 15 秒内确实发生了变化,您仍然使用 INSTANCE_STATUS 的旧值,而不是检查此代码中是否有更新;因此,无论实例状态是否发生变化,循环始终是无限的。 【参考方案1】:

您的原始代码中有许多简单的错误:While 不是 while[ 周围缺少空格、缺少双引号、比较运算符 -eq-ne 不适用于比较字符串...

小心使用wait,这是一个有效的shell 命令。但可能你的意思是sleep。 Here details 关于差异。

试试这个:

while [ "$INSTANCE_STATUS" = "available" ] 
do
  sleep 15 # 'waits' 15 seconds.

  # ATTENTION: here you might need to 'refresh' $INSTANCE_STATUS value to avoid an endless loop.
  # Solution suggested by @Charles Duffy:
  # INSTANCE_STATUS=$(systemctl status "$SOURCE_INSTANCE_ID")

  if [ "$INSTANCE_STATUS" != "available" ]
  then 
    echo "$SOURCE_INSTANCE_ID is $INSTANCE_STATUS"
  fi
done

已编辑:@Charles Duffy 建议对原始答案进行许多修复 ...forced ;)。谢谢查尔斯,现在我意识到我的 shell 脚本技能已经很生疏了。

【讨论】:

以上是关于Shell 语法错误:“虽然:找不到命令”的主要内容,如果未能解决你的问题,请参考以下文章

我在将我的 bash 命令转换为 shell 脚本中的 shell 脚本语法错误时遇到错误

shell 判断脚本有无语法错误

Shell - 表达式中的语法错误(错误标记为“16”)

shell脚本启动语法错误syntax error near unexpected token '{

linux shell脚本中for循环的语法

尝试在 MariaDB shell 中重置 Root 密码时出现语法错误