Bash多个端口映射取决于脚本参数

我有一个脚本,接受作为一个参数; 那么我的脚本必须根据这个参数创build一个端口映射的docker容器; 例如,如果我跑。 /myscript.sh 10 ,myscript.sh必须创build一个具有10端口映射的/myscript.sh 10容器。

这是我的myscript.sh

 #!/bin/bash NCACHES=$1 PORT_BASE=80 docker run -idt --name CONTAINER then..? 

如果参数值是,例如,5,我会这个myscript创build一个端口映射80,81,82,83,84的容器。 我怎么能在bash脚本中pipe理这个条件?

参数值= 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映射。

我宁愿使用一个数组,并通过操纵里面的内容,

 portArr=() for ((i=0;i<NCACHES;i++)); do portArr+=( -p "$((PORT_BASE+i)):$((PORT_BASE+i))") done 

一旦数组被填充,您可以通过打印来validation其内容

 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[@]}" 

你可以迭代一个序列,从而:

 for i in $(seq 1 $1); do echo $i; done 

它将在1和你input的数字参数之间循环。 你可以在上面添加一个代表你的命令行的string。

请注意,您可以使用${1..5} (例如)在固定值之间扩展bash中的范围,但在范围内使用variables时,这不起作用。

那么这样的事情呢?

 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所指出的,你必须用variables$(seq xy),谢谢!