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只支援一維陣列,所以採取上面的方式。在取數組裡的值時,就需要處理下面這些問題:
- 我要知道這次要取的是第幾個元素,也就是說env的值是test10的話,我需要提取出來這個10;
- 我要將第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