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' 一样 |
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") |
Bash 4.4 中新增的 ${parameter@operator} 语法的更多相关文章
- Bash 脚本编程语言中的美学与哲学
我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨 Bash 脚本语言中的美学与哲学. 这不是一篇 Bash 脚本编程的教程,但是却能让人更加深入地了解 Bash ...
- Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)
阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 ...
- Linux 桌面玩家指南:06. 优雅地使用命令行及 Bash 脚本编程语言中的美学与哲学
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- 在 .NET 4.0 中使用 .NET 4.5 中新增的特性(CallerMemberNameAttribute/CallerFilePathAttribute/CallerLineNumberAttribute)
介绍 标题中所说的三个特性 CallerMemberNameAttribute / CallerFilePathAttribute / CallerLineNumberAttribute 我们统称为调 ...
- Linux Bash脚本编程语言中的美学与哲学
我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨Bash脚本语言中的美学与哲学. 这不是一篇Bash脚本编程的教程,但是却能让人更加深入地了解Bash脚本编程,更 ...
- shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected)
shell报错:-bash: [: ==: 期待一元表达式 解决方法 ([: ==: unary operator expected) blogdaren 2015-02-26 抢沙发 14916人 ...
- html5中新增的form表单属性
html5中新增两个表单属性,分别autocomplete和novalidate属性 1.autocomplete属性 该属性用于控制自动完成功能的开启和关闭.可以设置表单或者input元素,有两个属 ...
- [转]在NopCommerce中新增一个Domain Model的步骤
本文转自:http://www.cnblogs.com/aneasystone/archive/2012/08/27/2659183.html 在NopCommerce中新增一个Domain Mode ...
- S5中新增的Array方法详细说明
ES5中新增的Array方法详细说明 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wor ...
随机推荐
- 安装node-sass提示没有vendor目录的解决办法
在node-sass目录下面新建一个vendor的空目录,然后运行npm/cnpm rebuild node-sass --save-dev即可,如果安装失败,会生成一个目录名为类似这样win32-x ...
- BZOJ1190[HNOI2007]梦幻岛宝石
Description 给你N颗宝石,每颗宝石都有重量和价值.要你从这些宝石中选取一些宝石,保证总重量不超过W,且总价值最大为,并输出最大的总价值.数据范围:N<=100;W<=2^30, ...
- Java面试宝典摘抄
1,ClassLoader知识 加载流程:当运行一个程序时,JVM启动,运行bootstrap classloader,该classloader加载Java核心API(此时ExtClassLoader ...
- 在IIS中实现JSP
在IIS中实现JSP IIS本身是不可以支持JSP页面的,但是随着JAVA技术的广泛应用,越来越多的网站采用JAVA技术编写程序,我们根据一些资料和自己的实践经验总结了以下两种JAVA应用服务器 ...
- 电改:OPower资料调研
0.简介 power公司是于 2007 年创办,是全球领先的家庭能源管理企业.家庭能源数据分析公司.Opower 与公用电力公司合作,抢占家庭消费者"入口",获取家庭消费者 ...
- 搭建TFS 2015 Build Agent环境(三)
在配置时,一定要注意下面的几个地方: 1.项目集合生成服务账号 中一定要包含: 2.Build Agent机器上防止Agent的路径一定要短,不要出现特殊字符,比如:C:\Agent 3.一定要安装V ...
- ruby不能识别中文的一个坑
需要安装readline,并重装ruby,挂readline编译. 后续发现总出错,然后发现brew包依赖不全,按照提示,一个一个的安装依赖.安装后使用rvm重装ruby就ok了. 多亏能够有办法上g ...
- add添加
s = {1,2,3,4,5,6,} 进行添加数据! s = {1,2,3,4,5,6,} s.add('s')#添加字符串's' s.add('3')#添加字符串'3' s.add(3)#添加3和字 ...
- 面向对象和面向过程的js版选项卡
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- PyQt 自定义信号带参数
import sys from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QMainWindow, QAp ...