Bash各类扩展详解

Bash各类扩展详解

Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为Bash脚本开发带来极大的便捷性,省去很多不必要的操作。同时,这些扩展也是Bash不可或缺的部分,没有了他们Bash可能就是个简单的命令行输入接口而已了。

大括号扩展

大括号扩展主要用于生成随机的字符串,不仅是英语字符,也包括数字。对于数字的大括号扩展在for循环中,有着很重要的用途。大括号扩展的格式有两种,分别为:

  1. preamble+{string1,string2,...,stringN}+postscript
  2. preamble+{<START>..<END>[..<INCR>]}+postscript

并且大括号扩展是允许嵌套和组合的。

# 第一种形式
echo a{b,c,d,e}f
# abf acf adf aef

# 第二种形式
echo a{b..e}f
# abf acf adf aef

echo a{1..4}f
# a1f a2f a3f a4f

# 组合形式
echo {a,b}{1,2}
# a1 a2 b1 b2

# 嵌套形式
echo {{a..d},{A..D}}
# a b c d A B C D

实例测试结果如下:

大括号测试代码大括号测试结果

波浪号扩展

波浪号扩展主要用于目录匹配,有三种情况,第一种为匹配用户目录,第二种为目录栈中目录,第三种为工作目录。波浪号扩展的基本结构形式为:

~tilde-prefix

其中tilde-prefix的判定规则为,波浪号和斜杠之间的字符都为tilde-prefix,即tilde-prefix的内容在遇到斜杠时结束。在默认情况下,若tilde-prefix没字符处于引号中,则Bash会将tilde-prefix解释为用户名称。如果tilde-prefix为空,则默认使用HOME变量的内容替换,要是HOME变量也没有设置的话,就使用执行当前Bash的用户目录替换。如果tilde-prefix指定的用户不存在的话,则不执行任何替换。

tilde-prefix还有两种比较特殊的情况,分别是加减号和加减号加整数。如果为+号的话,则扩展为PWD变量的值;为-号的号,扩展为OLDPWD变量值。如果是[+,-]integer的形式,则等价于dirs +/-integer。

波浪号扩展的实例如下:

# 匹配用户目录,需要注意的是若存在该用户则执行扩展,若不存在则原样输出
echo ~jackie/Documents
# 存在jackie用户时, /home/jackie/Documents
# 不存在jackie用户时,~jackie/Documents

# 匹配目录栈中目录
# 相当于 dirs +N (N为任意整数), N前可有+或-,如果未设置则默认为+

echo ~+N
# 相当于 dirs +N

echo ~-N
# 相当于 dirs -N

# 匹配当工作目录
echo ~+
# 相当于 ${PWD},若未设置PWD环境变量,则原样输出

echo ~-
# 相当于 ${OLDPWD},若未设置OLDPWD环境变量,则原样输出

实例结果如下:

波浪号扩展测试代码波浪号扩展测试结果

变量扩展

由于变量扩展中牵扯到很多Bash中的模式匹配,这里将简单的介绍下Bash中的模式匹配。Bash的模式匹配是很简单的,主要就是三个通配符。分别如下:

    • => 匹配任意字符串,包括空字符串。
  1. ? => 匹配任意单个字符。
  2. [...] => 匹配中括号中指定的任意一个字符。

Bash的模式匹配其实就是上面三个通配符的使用,可以说是正则表达式的简化版。

Bash中的变量匹配形式很多,下面会依次介绍。介绍代码如下:

# ${variable:-word},若variable的值为空或未设置,则扩展结果为word;否则,为variable值。
echo ${str:-abc}
# abc

# ${variable:=word},若variable的值为空或未设置,则将variable置为word,然后扩展结果为variable值。
echo ${str:=abc}
# abc , 使用等号之后abc会赋值给str1变量

# ${variable:?word},若variable的值为空或未设置,则将word值写至标准错误并退出shell;否则,扩展结果为variable值
echo ${str:?abc}
# bash: str: abc,abc会写入stderr

# ${variable:+word},若variable值为空或未设置,则扩展结果为空,否则扩展结果为variable值。
echo ${str:+abc}
# 无任何输出,+号表示,str为空或不存在时,什么不做,否则使用abc

# ${!prefix*}、${!prefix@},扩展为以prefix开头的变量名称。
echo ${!str*}
# 扩展为以str开头的变量

# ${#variable},扩展为variable的字符串长度
echo ${#str}
# 返回str变量的字符长度
str=abcdefghi1234567

# ${variable:offset},获取从offset处到variable值结尾处的字符串
echo ${str:2}
# cdefghi1234567

# ${variable:offset:length},这里offset和length的负数含义和php中的substr相同,或者说跟通常的字符串子串截取一样
echo ${str:2:3}
# cde

# ${variable#word} ${variable##word}
echo ${str#abc}
# defghi1234567
# 在上面这两种形式中,word做为模式都会进行扩展,在扩展完成之后shell会删除该部分,variable中剩余的部分即为结果

# ${variable%word} ${variable%%word}
echo ${str%567}
# abcdefghi1234
# #和%的作用类似,匹配模式word,然后删除并得到结果,区别在于%从variable末尾开始,而#从开始位置开始。

# ${variable/pattern/string}
echo ${str/#abc/jackie}
# jackiedefghi1234567
# 子串替换,符合pattern的字符串替换为string,模式中#好表示从开始位置开始,%表示从结尾位置开始,/表示所有匹配pattern都替换。默认情况下只替换首个匹配pattern的字符串。

# ${variable^pattern} ${variable^^pattern} ${variable,pattern} ${variable,,pattern}
echo ${str^^?}
# ABCDEFGHI1234567
# 大小写转换,^小写至大写,,大写至小写,^和,仅修改首个字符,^^和,,修改每个字符。pattern中不应该包含多个字符

变量扩展实例结果:

变量扩展测试代码变量扩展测试结果

子命令扩展

子命令的主要作用是将一个命令的输出替换替换该命令自身,即命令的执行结果作为该命令所在位置的内容。在shell脚本中,子命令大大的提供了各种工具复用的便捷程度。子命令的形式如下:

# 形式一
$(command)

# 形式二
`command`

算数扩展

算数扩展主要用于在Bash中进行简单的计算,格式为 $(( expression )) 。相关事例如下:

echo $(( 5+3 ))

Bash支持所有C语言中的运算符号,下文实例中部分符合运算未列出。且算数扩展是支持相互嵌套的。

具体实例为:

算数扩展测试代码算数扩展测试结果

文件名扩展

Bash中路径扩展,实质即为模式匹配,Bash将任何包含*、?和[...]的单词都会进行文件名匹配。例如

# 打印出当前目录下所有以png结尾的文件名,需要注意的是目录也在匹配的范围中,不能简单的以为只匹配文件。
echo *.png

总结

Bash所提供的各种扩展特性,为Bash的日常操作带来了极大的便捷性,不管是运维人员还是各方向的程序开发者,个人认为都应该对其熟练掌握,以提供日常的工作效率。

转载于:https://my.oschina.net/taodf/blog/2208678

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shell高级编程,中英文合集,均为高清版 目录如下: 第一部分. 热身 1. 为什么使用shell 编程 2. 带着一个Sha-Bang 出发(Sha-Bang 指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash 变量是不分类型的 4.4. 特殊的变量类型 5. 引用(翻译的可能有问题,特指引号) 5.1. 引用变量 5.2. 转义(\) 6. 退出和退出状态 7. Tests 7.1. Test 结构 7.2. 文件测试操作 7.3. 其他比较操作 7.4. 嵌套的if/then 条件test 7.5. 检查你的test 知识 8. 操作符和相关的主题 8.1. 操作符 8.2. 数字常量 第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare 或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环和分支 10.1. 循环 10.2. 嵌套循环 10.3. 循环控制 10.4. 测试与分支(case 和select 结构) 11. 内部命令与内建 11.1. 作业控制命令 12. 外部过滤器,程序和命令 12.1. 基本命令 12.2. 复杂命令 12.3. 时间/日期命令 12.4. 文本处理命令 12.5. 文件与归档命令 12.6. 通讯命令 12.7. 终端控制命令 12.8. 数学计算命令 12.9. 混杂命令 13. 系统与管理命令 13.1. 分析一个系统脚本 14. 命令替换 15. 算术扩展 16. I/O 重定向 16.1. 使用exec 16.2. 代码块的重定向 16.3. 应用 17. Here Documents 17.1. Here Strings 18. 休息时间 Part 4. 高级 19. 正则表达式 19.1. 一个简要的正则表达式介绍 19.2. 通配 20. 子shell(Subshells) 21. 受限shell(Restricted Shells) 22. 进程替换 23. 函数 23.1. 复杂函数和函数复杂性 23.2. 局部变量 23.3. 不使用局部变量的递归 24. 别名(Aliases) 25. 列表结构 26. 数组 27. /dev 和 /proc 27.1. /dev 27.2. /proc 28. 关于Zeros 和Nulls 29. 调试 30. 选项 31. Gotchas 32. 脚本编程风格 32.1. 非官方的Shell 脚本风格 33. 杂项 33.1. 交互式和非交互式的shells 和脚本 33.2. Shell 包装 33.3. 测试和比较: 另一种方法 33.4. 递归 33.5. 彩色脚本 33.6. 优化 33.7. 各种小技巧 33.8. 安全话题 33.8.1. 被感染的脚本 33.8.2. 隐藏Shell 脚本源码 33.9. 移植话题 33.10. 在Windows 下进行Shell 编程 34. Bash, 版本 2 和 3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 哪里可以取得帮助? 35.4. 制作这本书的工具 35.4.1. 硬件 35.4.2. 软件和排版软件
Bash是一种Unix shell,它提供了一种在命令行下交互式地使用命令的方式。Bash也是一种脚本语言,可以编写脚本来自动化任务、批处理作业、系统管理等方面。下面是Bash脚本语言的一些详解。 1. 变量 在Bash脚本中,变量可以用来存储值。变量名必须以字母或下划线开头,后面可以跟任意数量的字母、数字或下划线。变量的值可以是字符串、数字或布尔值。 例如,下面的代码定义了一个名为“name”的变量,并将其值设置为“John”。 ``` name="John" ``` 2. 注释 在Bash脚本中,可以使用“#”符号来注释代码。任何在“#”符号后面的内容都会被忽略。 例如,下面的代码使用注释解释了变量的含义。 ``` # This is a variable for the user's name name="John" ``` 3. 条件语句 在Bash脚本中,可以使用条件语句来根据条件执行不同的代码。Bash支持if、elif和else语句来实现条件控制流程。 例如,下面的代码检查变量“name”的值是否等于“John”,如果是,则打印一条消息。 ``` if [ "$name" = "John" ]; then echo "Hello John!" fi ``` 4. 循环 在Bash脚本中,可以使用循环来重复执行一段代码。Bash支持for和while循环。 例如,下面的代码使用for循环打印数字1到5。 ``` for i in 1 2 3 4 5; do echo $i done ``` 5. 函数 在Bash脚本中,可以定义函数来封装一段可重用的代码。函数可以接受参数,并可以返回值。 例如,下面的代码定义了一个名为“greet”的函数,该函数接受一个名字参数,并打印一条问候消息。 ``` greet() { echo "Hello, $1!" } greet "John" ``` 以上是Bash脚本语言的一些基本概念和用法,还有很多其它的语法和特性可以在Bash脚本中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值