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

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' 一样

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

posted @   紫云飞  阅读(1456)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示