Bash 大括號小技巧:Parameter Expansion



前言



Bash 大括號其他小技巧

指定變數預設值

對於某變數要指定預設值,可以在大括號內:-的方式表示,例如

1
COLOR=${INPUT_COLOR:-"#0000FF"}

上面表示:

  • 變數 COLOR 會指派成 INPUT_COLOR 的值
  • 但如果 INPUT_COLOR 此變數不存在的時候,他會給定預設值 #0000FF

可以比較一下以下結果

1
2
3
4
5
6
7
echo ${VAR:-123}
# 123


VAR=456
echo ${VAR:-123}
# 456




動態變數 (Dynamic variable)、間接變數 indirect variables

  • 有的時候會需要一個指向變數的變數,來完成一些方便的設定、或是簡化的 dict (Hashmap)。
  • 例如以下例子
1
2
3
4
5
6
7
realvariable1=contents_1
realvariable2=contents_2

ref=realvariable1

# 如果改成以下也能快速套用就太好了
# ref=realvariable2

希望在不更動 ref 的情況下,藉由修改 ref 指向的變數,來得到最後的值。

此時需要用 ! 協助,寫成 ${!<YOUR_VAR>} 的形式,如下:

1
2
3
4
5
echo ${!ref}   # contents_1

ref=realvariable2

echo ${!ref}   # contents_2




字串切除符合項目

把字串依照給定的文字,如果符合就從前面分割、或是從後面分割:

1
2
3
4
5
# 從前面分割
${parameter#word} 

# 從後面分割
${parameter%%word}

舉例來說

SITE_NAME="ktlast.com"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 從前面切除 ktlast
echo ${SITE_NAME#ktlast}

.com



# 從後面切除 com
echo ${SITE_NAME%%com}

ktlast.

如果寫反、就代表比對失敗,也就沒有效果:

1
2
3
echo ${SITE_NAME%%ktlast}

ktlast.com



REF

  1. https://stackoverflow.com/questions/14152534/variable-expansion-in-curly-braces
  2. https://stackoverflow.com/questions/16553089/dynamic-variable-names-in-bash
  3. http://mywiki.wooledge.org/BashFAQ/006#Indirection
  4. https://unix.stackexchange.com/questions/683418/bash-to-read-file-and-get-keyvalue-pair-split-by-spaces

主題 StackJimmy 設計