Bash脚本检测单个Docker容器运行时出现bad substitution错误的原因
错误原因及修正方案
错误原因
你写的${#"$(docker ps -q --filter name=image-name)"}违反了Bash的参数扩展语法规则:
- Bash中
${#VAR}用于获取变量VAR的字符长度,但不能直接将带引号的命令替换("$(...))嵌套在${#}内部,这种写法属于非法的参数替换,因此会抛出bad substitution错误。
另外补充一点:你通过字符长度判断是否为单个容器的逻辑存在隐患——docker ps -q输出的容器ID默认是12位字符,且多个容器时会每行输出一个ID,用字符长度判断容易出现误判(比如单个ID的长度可能不是8,或者多个ID的总长度刚好等于8)。
修正后的脚本示例
方法1:用变量存储输出后判断长度
while true; do # 捕获容器ID输出 container_ids=$(docker ps -q --filter name=image-name) # 判断输出长度是否符合预期 if [ ${#container_ids} -eq 8 ]; then break fi echo wait sleep 1 done echo OK
方法2:更可靠的行数判断(推荐)
直接统计输出的行数,判断是否仅有1个容器在运行:
while [ $(docker ps -q --filter name=image-name | wc -l) -ne 1 ]; do echo wait sleep 1 done echo OK
内容的提问来源于stack exchange,提问作者Fred Hors
相关产品推荐
相关产品推荐

