Bash 4.4 中新增了一种 ${...} 语法,长这样:${parameter@operator}。根据不一样的 operator,它展开后的值多是 parameter 这个参数的值通过某种转换后的值,又多是关于 parameter 参数自身的某种信息。这句话太抽象了,仍是看下面的详细解释吧。数组
operator 一共有 5 种值,分别是 Q、E、P、A、a,都是单个的字母。bash
quote 的缩写,这个 operator 的功能是把 parameter 的值加上合适的引号,从而转换成在脚本中可重用的(reusable)字符串形式:字符串
$ foo=1table $ echo ${foo@Q}变量 '1' # 本来 foo 的值只有 1 这一个字符,转换后的值有三个字符 “'1'”语法 $ echo ${IFS@Q}脚本 $' \t\n' # 由于 IFS 中有不可打印字符,因此转换后的值会自动使用 ANSI 转义形式的引号 $'...',而且里面的字符也会使用反斜杠转义的形式tab |
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,\$ 变成 $ |
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 |
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") |