我有一个接受作为参数的脚本;那么我的脚本必须根据这个参数创建一个具有多个端口映射的docker容器;例如,如果我运行。/myscript.sh 10
,myscript.sh必须创建一个具有10端口映射的docker容器。
这是我的myscript.sh
#!/bin/bash
NCACHES=$1
PORT_BASE=80
docker run -idt --name CONTAINER then..?
如果参数值是,例如,5,我想myscript会创建一个端口映射为80,81,82,83,84的容器。我怎样才能在bash脚本中管理这个条件?
参数值= 5时,它预计会有:docker run -idt --name MYNAME -p 80:80 -p 81:81 -p 82:82 -p 83:83 -p 84: 84
编辑:我已经尝试了我的剧本:
#!/bin/bash
echo $1
docker run -idt --name CONTAINER `for x in {80..$(( 80 + ${1} ))}; do printf "-p ${x}:${x} "; done` pier92/balancer:latest
但这是输出:
./mapping.sh 5
5
./mapping.sh: riga 9: printf: -p: opzione non valida
printf: uso: printf [-v var] formato [argomenti]
75899b1ec4edab51530ad8c33e955a31a45fb946ecc6eb2fa3f1ba5b5537064a
pierpaolo@pignasecca:~/Scrivania/setup-arch/webapp$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75899b1ec4ed pier92/balancer:latest "nginx -g 'daemon ..." 7 seconds ago Up 4 seconds 80/tcp, 443/tcp CONTAINER
只映射了端口80.
答案 0 :(得分:2)
您可以迭代序列:
for i in $(seq 1 $1); do
echo $i;
done
将在1和输入数字参数之间循环。您可以在上面的代码中附加一个表示命令行的字符串。
请注意,您可以使用${1..5}
(例如)在固定值之间扩展bash范围,但在使用范围内的变量时这不起作用。
答案 1 :(得分:2)
我宁愿使用数组并传递操作里面的内容,
portArr=()
for ((i=0;i<NCACHES;i++)); do
portArr+=( -p "$((PORT_BASE+i)):$((PORT_BASE+i))")
done
填充数组后,您可以通过打印验证其内容
declare -p portArr
显示每个索引的值
declare -a portArr='([0]="-p" [1]="80:80" [2]="-p" [3]="81:81" [4]="-p" [5]="82:82" [6]="-p" [7]="83:83" [8]="-p" [9]="84:84")'
现在将其作为
传递给docker
命令
docker run -idt --name MYNAME "${portArr[@]}"
答案 2 :(得分:1)
这样的事情:
docker run -idt --name CONTAINER `for x in {80..$(( 80 + ${1} ))}; do printf "$x "; done`
输出类似于:
docker run -idt --name CONTAINER 80 81 82 83 84 85 86 87 88 89 90
阐释:
它只是一个打印数字序列的内联。
要在bash中执行求和,请使用此语法$(( x + y ))
。
编辑:
只需在printf中添加您需要显示的所有内容,在这种情况下将是:
docker run -idt --name CONTAINER `for x in $(seq 80 $(( 80 + ${1} )) ); do printf " -p ${x}:${x}"; done`
输出例如:
docker run -idt --name CONTAINER -p 80:80 -p 81:81 -p 82:82 -p 83:83 -p 84:84 -p 85:85 -p 86:86 -p 87:87 -p 88:88 -p 89:89 -p 90:90
正如Brian Agnew指出的那样,你必须使用$(seq x y)变量,谢谢!