Bash 4.4 中新增的 ${parameter@operator} 語法

Bash 4.4 中新增了一種 ${...} 語法,長這樣:${parameter@operator}。根據不一樣的 operator,它展開後的值多是 parameter 這個參數的值通過某種轉換後的值,又多是關於 parameter 參數自身的某種信息。這句話太抽象了,仍是看下面的詳細解釋吧。數組

operator 一共有 5 種值,分別是 Q、E、P、A、a,都是單個的字母。bash

Q

quote 的縮寫,這個 operator 的功能是把 parameter 的值加上合適的引號,從而轉換成在腳本中可重用的(reusable)字符串形式:字符串

$ foo=1table

$ echo ${foo@Q}變量

'1' # 本來 foo 的值只有 1 這一個字符,轉換後的值有三個字符 「'1'」語法

$ echo ${IFS@Q}腳本

$' \t\n' # 由於 IFS 中有不可打印字符,因此轉換後的值會自動使用 ANSI 轉義形式的引號 $'...',而且裏面的字符也會使用反斜槓轉義的形式tab

E

escape 的縮寫,這個 operator 的功能是把 parameter 的值中包含的轉義序列解義(unescape),就彷彿是把 parameter 的值放在了 $'...' 中間同樣:co

$ foo='\u4e00'字符

$ echo $foo

\u4e00 # foo 的值包含 6 個 字符,恰好是一個轉義序列

$ echo ${foo@E}

一 # 識別並轉換 foo 的值中的轉義序列,就像是執行了 echo $'\u4e00' 同樣

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")

相關文章
相關標籤/搜索