如何在Bash脚本中循环执行Docker run启动指定数量自定义镜像容器
问题原因
Bash 语法的扩展执行优先级中,大括号扩展早于变量扩展,你编写的for i in {1..${number}}语句不会被解析为1到传入数值的数字序列,实际只会被识别为单个字符串{1..${number}},因此循环仅会执行1次,只能启动1个容器。
修复方案
推荐使用兼容性更好的C风格for循环替换原有循环逻辑,Bash 3.0及以上版本均支持该写法:
#!/bin/bash docker build ./client -t python-mqtt-client while getopts ":n:i:f:" opt; do case ${opt} in n ) number=$OPTARG ;; i ) interval=$OPTARG ;; f ) format=$OPTARG ;; esac done echo ${number} echo ${interval} # 替换原有for循环为以下写法 for ((i=1; i<=number; i++)) do docker run -d --network mqtt-demo_default --name py-mqtt-client${i} python-mqtt-client /mqtt_client.py --interval ${interval} --format ${format} done
如果需要兼容更旧的Shell环境,也可以使用seq命令生成数字序列:
for i in $(seq 1 $number) do docker run -d --network mqtt-demo_default --name py-mqtt-client${i} python-mqtt-client /mqtt_client.py --interval ${interval} --format ${format} done
可选优化
可以增加参数校验逻辑,避免传入非法的数值参数导致运行异常:
# 放在getopts逻辑之后,循环执行之前 if ! [[ $number =~ ^[1-9][0-9]*$ ]]; then echo "错误:-n 参数必须为正整数" exit 1 fi if ! [[ $interval =~ ^[0-9]+$ ]]; then echo "错误:-i 参数必须为非负整数" exit 1 fi
内容的提问来源于stack exchange,提问作者Sam Dillard
相关产品推荐
相关产品推荐

