如何解决Bash脚本中kubectl命令输出无法保存到变量的问题
解决Bash中无法捕获kubectl输出到变量的问题
问题原因
kubectl输出的No resources found类提示属于标准错误输出(stderr),而Bash的命令替换语法$(命令)默认仅捕获*标准输出(stdout)*的内容,所以你执行赋值操作后变量为空,自然无法匹配成功。
另外现有代码存在逻辑缺陷:仅在进入循环前执行了一次kubectl命令,后续循环过程中foo的值不会更新,会出现死循环或永远无法进入匹配分支的问题。
解决方案
方案1:捕获标准错误输出(需比对提示文本时使用)
在kubectl命令末尾添加重定向规则2>&1,将标准错误合并到标准输出中,即可被命令替换正常捕获。同时需要把kubectl执行逻辑放到循环内部,每次循环重新取值。
while true do # 合并标准错误和标准输出后赋值给变量 foo=$(kubectl get all -n mattermost 2>&1) # 可选:去除变量首尾的空格、换行符,避免格式差异导致匹配失败 foo=$(echo "$foo" | xargs) if [ "$foo" = "No resources found in mattermost namespace." ]; then echo "yay" # 可选添加休眠,避免对apiserver发起请求过于频繁 sleep 2 else # 已查询到资源时退出循环 break fi done
方案2:直接判断命令退出码(更稳定,推荐)
不需要捕获输出的场景更推荐该方案:kubectl查询不到指定资源时会返回非0的退出码,直接判断退出码即可实现逻辑,不会因为kubectl版本变更提示文本导致匹配失效。
# 丢弃所有输出,仅判断命令执行结果:查询不到资源时进入循环 while ! kubectl get all -n mattermost > /dev/null 2>&1 do echo "yay" sleep 2 done
内容的提问来源于stack exchange,提问作者Lucas Scheepers
相关产品推荐
相关产品推荐

