SHELL 八大扩展

最近在梳理bash知识的的过程中,有幸阅读了man bash文档,一时间犹如醍醐灌顶一般,很多当初不明白的地方都豁然开朗,现在就其中的一点做一分享,同时也为man bash做一下广告,当你面对bash问题孤立无援的时候,别忘了还有man bash的陪伴。

Bash 支持的扩展种类有:brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion(为了表述精确起见,这里就直接应用原文中的术语了)。还有一个叫:process substitution

他们的优先级顺序为:brace expansion, tilde expansion, parameter, variable expansion, arithmetic expansion, command substitution , word splitting, pathname expansion

brace expansion

brace值得就是“{ }”。该扩展是用来生成字符串的,下面举两个例子:

如果括号中间是“..”,则生成连续字符

tilde expansion

tilde值得就是“~”,我们都清楚~指的是HOME,这里还有另外两个,他们是“~+”和“~-”,分别代表PWD和OLDPWD,使用这两个可以刚方便我们的脚本编写,举个例子:

Parameter expansion

这个是bash中最重要、也是最常用的扩展,但整整了解他的人并不多,这里就来揭开它不为人知的另一面:

它的标准形式为${parameter},简写为$parameter,使用${parameter}可以避免很多不必要的麻烦。

${parameter:-word},如果parameter为空,或者根本没有定义parameter,则采用默认值,

${parameter:=word},如果parameter为空,或者根本没有定义parameter,则赋予默认值

上面两个的区别在于前者没有给parameter赋值,举个例子:

${parameter:?word},如果parameter为空,或者根本没有定义parameter,则打印出错信息

${parameter:+word},如果parameter取值不为空,则用word替换

${parameter:offset}

${parameter:offset:length}

上面两个是用来截取指定长度字符串的,截取的下标offset从0开始计数,长度由length指定。如果没有指定length,则一直截取的末尾:

${!prefix*}

${!prefix@}

这两个的意思相同,都是扩展成以prefix为开头的变量名称,同时会使用IFS的第一个变量把他们分隔开。例如:

${!name[@]}

${!name[*]}

这两个是用来查询数组下标的。打印出来的是name数组有哪些下标。注意:这个和${name[@]},${name[*]}不同,这两个是打印的每个数组元素的内容,而我们这里在讲的这两个是打印的数组下标。例如:

补充一点,如果你使用了associative array,他会自动取代下标为0的元素。例如:

${#parameter},打印parameter的长度,

${parameter#word},使用pathname expansion把word作为一个pattern来扩展,从头开始扫描parameter,输出满足patter的最短匹配串。

${parameter##word},使用pathname expansion把word作为一个pattern来扩展,从头开始扫描parameter,输出满足patter的最长匹配串。

${parameter%word},使用pathname expansion把word作为一个pattern来扩展,从尾开始扫描parameter,输出满足patter的最短匹配串。

${parameter%%word},使用pathname expansion把word作为一个pattern来扩展,从尾开始扫描parameter,输出满足patter的最长匹配串。

${parameter/pattern/string},用string替换parameter中的pattern。从头扫描,pattern采用的是pathname expansion;替换第一个匹配

${parameter//pattern/string},用string替换parameter中的pattern。从头扫描,pattern采用的是pathname expansion;替换所有匹配

另外的,如果parameter是数组,那么数组的每个元素都采取相同的策略,如:

command substitution

很常用的功能,两种形式:$(command)和`command`,基本使用说,地球人都知道。但是如果要想嵌套怎么办呢?看了下面的例子你就明白了:

对了,就是用反斜杠转移来实现嵌套。

arithmetic expansion

形式为:$((expression)),例如:

Process Substitution

这个扩展在开始没有提到。这个扩展使用了FIFO,所以,他只能在支持FIFO的系统中使用。他的形式为<(command list)或者>(command list)。用到这个扩展的时候,它会在/dev/fd中生成临时文件,用来接收command list的输出,然后,把里面的内容发送给当前的命令。这个命令在需要临时保存某几个命令的输出,并把输出用来后续处理的时候非常有用,可以避免生成过多临时文件。例如:

从最后一条命令的输出可以看得出,这种替换是把中间的结果放到了两个临时文件中,它们是:/dev/fd/63和/dev/fd/62。命令完成后,这两个文件就会消失。

Word splitting

顾名思义,就是按照IFS分割输出,例如:

pathname expansion

就是我们常用的ls ? ls *。? * 的含义大家都清楚。但是这个扩展行为与set和shopt中个多个设置有关,现列举如下:

noglob -d 禁止用路径名扩展。即关闭通配符。(用set –o可以看到,后面的用shopt可以看到)

dotglob bash在文件名扩展的结果中包括以点(.)开头的文件名

extglob 打开扩展的模式匹配特征(正常的表达式元字符来自Korn shell的文件名扩展)

nocaseglob 如果设置,当执行文件名扩展时,bash在不区分大小写的方式下匹配文件名

nullglob 如果设置,bash允许没有匹配任何文件的文件名模式扩展成一个空串,而不是它们本身

failglob 如果pattern没有匹配到任意一个结果,则提示出错。

含义说的很明白,这里不举例了

SHELL 八大扩展

时间: 2024-10-12 02:52:44

SHELL 八大扩展的相关文章

shell脚本扩展

一.正则表达式: 正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.grep.find.awk.sed等

Shell特殊扩展变量的实践

博主名:李常明 博客地址:http://keep88.blog.51cto.com 此笔记出自老男孩书籍:跟老男孩学linux运维  shell编程实战 特殊扩展变量 1.${parameter:-word}功能实践 ${parameter:-word}的作用是如果parameter变量值为空或未赋值,则会返回word字符串替代变量的值 例如: [[email protected] ~]# echo $test    #>==   此时test变量未赋值 [[email protected] ~

Linux Shell参数扩展(Parameter Expansion)

本文主要参考:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 其他资料:http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html 参数扩展的表示形式为:${expression}.expression包括各种字符直到匹配上'}'.当出现以下情况时候'}'不会被检查来匹配: 1)在转义字符\之后,如\{

[翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展之右键菜单

我自己的前言说明: 本文原作者为Dave Kerr,原文链接为.NET Shell Extensions - Shell Context Menus,我是在为了完成最新需求的时候查询资料的时候发现的,因为太久没有看外文资料了,所以为了锻炼一下翻译的,文中有一句未能翻译出来. Download SharpShell source code - 1.8 MB   Download SharpShell Tools - 181.1 KB  Download SharpShell core librar

老男孩新书Shell编程实战预定开始了-包邮包答疑

老男孩新书Shell编程实战预定开始了(扫图中二维码购买包邮定期包答疑),亲爱的伙伴们,让你们久等了.电脑用户猛戳 电脑购买链接 注意:包邮包3个月(2017春节后起算)Q群书籍内容答疑,等于白送书,还倒搭答疑服务. 如果觉得给力,请帮忙朋友圈.QQ群.空间转载! 活动优惠仅限本次活动,从其他渠道购买不享受此次的服务承诺. 定价 89元 基本信息 作者: 老男孩 丛书名: Linux/Unix技术丛书 出版社: 机械工业出版社 ISBN:9787111556077 上架时间:2017-1-6 出

linux shell脚本执行错误:bad substitution

脚本test.sh内容: #!/bin/bash read pressKey indexes=0 c=${pressKey:indexes:1} 使用调试方式执行:sh -x test.sh第3行总出现bad substitution提示信息. 百思不得其解: 于是百度,查到一条有用信息,这与linux shell使用的是/bin/sh,还是/bin/bash有关系.我的脚本中指定使用的是/bin/bash shell,但是我在调试的时候使用的是sh shell,因此调试时导致错误提示信息. 解

使用Shell脚本对Linux系统和进程资源进行监控

ShellLinux脚本 摘要:Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.本文我们以Bash做为实例总结了使用Shell对系统和进程资源进行监控的一些内容,希望对您能有帮助. Shell语言对于接触Linux的人来说都比较熟悉,它是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命 令并把它送入内核去执行.实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.它没有一般编程语言的“

Linux shell基础(十二)

二十三. Bash Shell编程:  1.  读取用户变量:    read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY.下面的列表给出了read命令的常用方式: 命令格式 描述 read answer 从标准输入读取输入并赋值给变量answer. read first last 从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中

mac上的终端bash命令(一) Bourne-Again Shell简介

mac上的终端使用的是Bourne-Again Shell命令,简称bash bash是GNU组织开发和推广的一个项目,是对Bourne shell的扩展 Bourne shell是 UNIX 最初使用的 Shell,作者Steven Bourne bash是许多Linux平台的内定Shell,传统UNIX上还有许多Shell,包括tcsh.csh.ash.bsh.ksh Shell Script大致都类同,一个Shell Script通常可以在很多种Shell上使用 狭义的Shell指的就是命