Shell中括号的使用

括号的基本介绍

  • 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