AWS CLI相关Bash脚本中复合条件比较的语法问题求助
修正AWS ECS任务检查Bash脚本的条件判断问题
嘿,我看你在写AWS CLI相关的Bash脚本时,第18行的条件判断踩了语法和逻辑的坑——那行的写法完全不符合Bash的[(test命令)规则,咱们一步步来把它捋顺:
先说说你原写法的问题
你写的if [ "$(state)" ] != [ "$(task_name)" && "RUNNING" ]有两个核心问题:
- 语法错误:
[是一个独立的命令,不能把两个[ ... ]用!=直接拼接,而且&&在[内部也不能这么用,得用-a或者拆成多个条件判断。 - 逻辑表述模糊:
function1 != (function2 && 字符串)这个逻辑本身有点歧义,我猜你实际想实现的是**“当任务不是(指定名称且状态为RUNNING)”**,也就是只要任务名称不对,或者状态不是RUNNING,就触发后续逻辑——如果是这个需求,咱们来写正确的代码:
正确的条件判断写法
写法一:用!取反复合条件(最易读)
把“任务名称正确且状态为RUNNING”作为一个复合条件,然后取反:
if ! ([ "$(task_name)" = "你的目标任务名" ] && [ "$(state)" = "RUNNING" ]); then # 这里写你要执行的逻辑,比如告警、重启任务等 echo "任务状态或名称不符合预期" fi
写法二:拆成等价的逻辑(或运算)
根据逻辑运算的德摩根定律,! (A && B)等价于!A || !B,所以也可以写成:
if [ "$(task_name)" != "你的目标任务名" ] || [ "$(state)" != "RUNNING" ]; then echo "任务状态或名称不符合预期" # 后续逻辑 fi
额外的小提示
- 调用AWS CLI的函数时,最好用
xargs处理输出,避免多余的换行或空格干扰判断:"$(task_name | xargs)" "$(state | xargs)" - 字符串比较时,
=两边一定要加空格,Bash对空格很敏感,写成"$(task_name)"="xxx"会报错。 - 如果你的
state函数还没写完,补全后的样子大概是这样:state () { aws ecs describe-tasks --region ${region} --cluster ${cluster} --tasks "$task" --query 'tasks[].lastStatus' --output text }
内容的提问来源于stack exchange,提问作者eekfonky
相关产品推荐
相关产品推荐

