括号的基本介绍
- shell中分为大括号、中括号、小括号;大括号又名花括号,中括号又名方括号,小括号又名圆括号;
- shell根据功能的不同进行区分括号的功能。
- shell根据扩展功能的区分,括号功能如下:
大括号
变量的判断与初始化,示例如下:
sh-4.2# file=/dir1/dir2/dir3/my.file.txt sh-4.2# echo ${file#*/} dir1/dir2/dir3/my.file.txt
普通扩展,示例如下:
sh-4.2# echo a{b,c,d,e,f,g}h abh ach adh aeh afh agh
自动补全,示例如下:
sh-4.2# echo {a..f} a b c d e f
代码块,示例如下:
#!/bin/bash num() { ls -lah } num
中括号
shell扩展中并没有中括号的使用,shell命令中对中括号主要是用于判断,类似test,示例如下:
1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来;而双括号的TEST命令不会对变量进行单词分离。以下情况分为变量为单个单词,含有空格的词组。
sh-4.2# name=hello sh-4.2# [ $name = "hello" ] sh-4.2# echo $? 0 sh-4.2# [[ $name = "hello" ]] sh-4.2# echo $? 0
得出结论,因为变量只有一个单词,单双括号的单词分离都没有影响到这个变量了。
sh-4.2# name="hello world" sh-4.2# [ $name = "hello world" ] sh: [: too many arguments sh-4.2# echo $? 2 sh-4.2# [ "$name" = "hello world" ] sh-4.2# echo $? 0 sh-4.2# [[ $name = "hello world" ]] sh-4.2# echo $? 0
这次变量是一个词组了,带空格那种了。当我们要测试时,结果发现BASH回应参数太多了,这是怎么回事呢?原来是单引号TEST命令对变量进行单词分离了,结果也就变成了[ hello world = “hello world” ],多了那个字符串hello,成了字符串world和字符串hello world之间的比较了。因此如果在单括号的TEST命令中的变量含有空格,但它还得和字符串比较,那就必须给变量加个双引号了,这时它就不会发生错误了。而在下面的双括号的TEST命令中,即使变量含有空格又何妨,因为它不能对变量单词进行分离。
2.单方括号的TEST命令,通常用内置的TEST命令来测试表达式的值,TEST命令也被链接到方括号上。这样,既可以使用单独的TEST命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。
sh-4.2# ls -lah test -rw-r--r-- 1 root root 6 Dec 17 15:51 test sh-4.2# test -r test ; echo $? 0 sh-4.2# [ -r test ]; echo $? 0
3.单括号的TEST命令不对SHELL元字符进行扩展的,而双括号TEST命令则会对SHELL元字符进行扩展的了。言外之意,双中括号支持正则。
sh-4.2# name=tom sh-4.2# [ $name = t?? ] sh-4.2# echo $? 1 sh-4.2# [[ $name = t?? ]] sh-4.2# echo $? 0
4.在双括号的TEST命令当中,如果一个字符串(不管含不含有空格)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。
我的理解是如果一个字符串值(右边那个的了)不加双引号,那这个字符串就是模式来的,如果它里面有含有SHELL元字符,BASH会对它进行扩展。如果字符串加了双引号,那它就是一个很普通的字符串的,即便字符串里面里面含有特殊字符,也就是当普通内容来处理。
sh-4.2# name=tomm sh-4.2# [[ $name = tom ]] sh-4.2# echo $? 1 sh-4.2# name=tom sh-4.2# name1=tomm sh-4.2# [[ $name = tom ]] sh-4.2# echo $? 0 sh-4.2# [[ $name = tom? ]] sh-4.2# echo $? 1 sh-4.2# [[ $name1 = tom ]] sh-4.2# echo $? 1 sh-4.2# [[ $name1 = tom? ]] sh-4.2# echo $? 0 sh-4.2# [[ $name = "tom" ]] sh-4.2# echo $? 0 sh-4.2# [[ $name = "tom?" ]] sh-4.2# echo $? 1 sh-4.2# [[ $name1 = "tom" ]] sh-4.2# echo $? 1
5.[ express1 –a express2 ] 这是放在单括号的TEST命令中的,因为单的不支持元字符扩展,因此就只能叫做表达式了,它们可以组合构成逻辑测试的,不过与或非使用( -a –o !)的形式。
sh-4.2# ls -lah test -r--r--r-- 1 root root 6 Dec 17 15:51 test sh-4.2# [ -r test -a -x test ] sh-4.2# echo $? 1
[[pattern1 –a pattern1]] 这是放在双括号TEST命令中的,因为单条式子可以支持元字符嘛,所以可以叫做模式表达式了,也就可以用于复合逻辑了,不过与非或使用(&& || !)的形式了。
sh-4.2# echo $name tom sh-4.2# [[ $name = [tT]om && $name = t?? ]] sh-4.2# echo $? 0
小括号
1、单小括号( ):把括号内的命令在另一个shell执行,并把结果返回,左右不留空格,一般要带前缀 $;示例如下
sh-4.2# echo $(ls) 1 test sh-4.2# ls -lah total 8.0K drwxr-xr-x 2 root root 27 Dec 17 17:51 . dr-xr-xr-x. 19 root root 268 Dec 17 15:03 .. -rw-r--r-- 1 root root 80 Dec 17 17:51 1 -r--r--r-- 1 root root 6 Dec 17 15:51 test
2、双小括号(( )) :整数比较、四则运算,括住的内容,完全符合C语言语法,一般要带前缀 $
sh-4.2# echo $((1+2)) 3
shell根据正则功能的区分
大括号表示次数,示例如下
sh-4.2# cat file 1234 11234 2345 22345 5678 12345678 sh-4.2# grep -E "1{2}" file --color 11234
中括号表示范围,示例如下
sh-4.2# grep -E "[1-4]" file --color 1234 11234 2345 22345 12345678
小括号表示一个完整的字符串,示例如下
sh-4.2# grep -E "(1234)" file --color 1234 11234 12345678
转载于:https://www.cnblogs.com/guge-94/p/10482276.html