Bash 4.4 中新增了一種 ${...} 語法,長這樣:${parameter@operator}。根據不同的 operator,它展開後的值可能是 parameter 這個引數的值經過某種轉換後的值,又可能是關於 parameter 引數自身的某種資訊。這句話太抽象了,還是看下面的詳細解釋吧。
operator 一共有 5 種值,分別是 Q、E、P、A、a,都是單個的字母。
Q
quote 的縮寫,這個 operator 的功能是把 parameter 的值加上合適的引號,從而轉換成在指令碼中可重用的(reusable)字串形式:
$ foo=1 $ echo ${foo@Q} '1' # 原本 foo 的值只有 1 這一個字元,轉換後的值有三個字元 “'1'” $ echo ${IFS@Q} $' \t\n' # 因為 IFS 中有不可列印字元,所以轉換後的值會自動使用 ANSI 轉義形式的引號 $'...',並且裡面的字元也會使用反斜槓轉義的形式 |
E
escape 的縮寫,這個 operator 的功能是把 parameter 的值中包含的轉義序列解義(unescape),就彷彿是把 parameter 的值放在了 $'...' 中間一樣:
$ foo='\u4e00' $ echo $foo \u4e00 # foo 的值包含 6 個 字元,剛好是一個轉義序列 $ echo ${foo@E} 一 # 識別並轉換 foo 的值中的轉義序列,就像是執行了 echo $'\u4e00' 一樣 |
P
prompt 的縮寫,這個 operator 的功能是把 parameter 的值按照提示符變數(PS1...)的轉義規則解義,就像 Bash 解義 PS1... 一樣:
$ foo='提示符-\s-\v\$' $ echo ${foo@P} 提示符-bash-4.4$ # \s 變成了 bash,\v 變成了 4.4,\$ 變成 $ |
A
assignment 的縮寫,這個 operator 的功能是把 parameter 的值和它的名字一起,轉換成可重用的賦值語句的形式,如果 parameter 帶有任何的屬性,會進一步轉換成用 declare 命令宣告變數(帶對應屬性)的形式:
$ foo=1 $ echo ${foo@A} foo='1' # 最普通的賦值語句 $ readonly foo # 給 foo 加上 r 屬性 $ echo ${foo@A} declare -r foo='1' # declare 命令的形式 $ export foo # 給 foo 加上 x 屬性 $ echo ${foo@A} declare -rx foo='1' # 變成了兩個屬性 rx |
a
attribute 的縮寫,這個 operator 的功能是獲取 parameter 的所有屬性:
$ declare -irtu foo=1 $ echo ${foo@a} irtu |
陣列
若 parameter 是個帶有 [*] 或者 [@] 下標的陣列,那麼如果 operator 是 QEPa 中的一個,則返回的值是一個列表,列表中的值分別對應原陣列中的每個元素;如果 operator 是 A,則返回一個用 declare 宣告陣列的形式的字串:
$ readonly foo=(1 "$IFS" bar) $ echo ${foo[@]@Q} '1' $' \t\n' 'bar' $ echo ${foo[@]@A} declare -ar foo=([0]="1" [1]=$' \t\n' [2]="bar") |