shell数组和变量的应用

项目中有一个需求:用户选择test1,test2,…test10之间的一个变量(env),我用这个变量作为docker的名称去创建一个新的容器。其中端口号也是之前预订好的,需要指定两个,一个是ssh22端口的,一个是JAVA项目的,比如30001。
新起一个docker的命令如下:
docker run -idt --name ${env} -p xxxxx:22 -p yyyyy:30001 java-ssh:v1
为了方便起见,就将对应的端口号都写在一个数组里:
array=(
“00000:00000”
“40123:50123”
“40223:50223”
“40323:50323”
“40423:50423”
“40523:50523”
“40623:50623”
“40723:50723”
“40823:50823”
“40923:50923”
“41023:51023”
)
因为shell只支持一维数组,所以采取上面的方式。在取数组里的值时,就需要处理下面这些问题:

  1. 我要知道这次要取的是第几个元素,也就是说env的值是test10的话,我需要提取出来这个10;
  2. 我要将第10个元素分离成两个数字,41023和51023。

为了做实验,将上面的数字写成到一个shell文件中:test.sh,内容如下:

array=(
"00000:00000"
"40123:50123"
"40223:50223"
"40323:50323"
"40423:50423"
"40523:50523"
"40623:50623"
"40723:50723"
"40823:50823"
"40923:50923"
"41023:51023"
)
env1="test-10"
env2="test-1"
echo ${env1##*-}
echo ${env2##*-}
echo ${array[${env1##*-}]%:*}
echo ${array[${env1##*-}]#*:}

运行sh +x test.sh就可以看到输出结果是否符合预期。这里主要参考了https://www.cnblogs.com/xudong-bupt/p/3567096.html 这篇文章。

划重点(假设我们指定的符号是‘-’):
#-是去掉-左边的内容,##-是去掉最后一个-左边的内容
%-*是去掉-右边的内容,%%-*是去掉第一个-右边的内容

${env1##*-}:拿掉最后一条-及其左边的字符串:10
${env1%%-*}:拿掉第一个-及其右边的字符串:test

因此,echo ${array[${env1##*-}]%:*}输出的是取出array数组中下标为,env1这个变量最右边的-后面的数字,的元素的值,然后去掉:右边的字符串,只取最左边的。如果env1=test10的话,取的就是41023

你可能感兴趣的:(Linux)