Linux之shell中的大括号、中括号、小括号的使用详解+多示例

  • A+
所属分类:Linux  Linux基础
摘要

很多人和我一样对于shell的各种括号的各种用法肯定不是很清楚,有时候看见别人脚本都不知道是什么意思,今天就来说说bash中的大中小括号的用法和解释,本人常用bash所以也只能用bash来说明了,若其他shell有出入请勿怪我。

一、shell中的大括号(也叫花括号) "{}"的用法:

1、${var} 
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=lookback
[root@Legion100 ~]# echo "Legion$var"
Legionlookback
[root@Legion100 ~]# echo "$varLegion"

[root@Legion100 ~]# echo "${var}Legion"
lookbackLegion
[root@Legion100 ~]# 

解释:当变量名和后面的内容都是变量命名所允许的内容时候这时候直接用$var是不行的得用{}把变量名括起来

2、${var:-string}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=""
[root@Legion100 ~]# echo ${var:-a}
a
[root@Legion100 ~]# var=lookback
[root@Legion100 ~]# echo ${var:-a}
lookback
[root@Legion100 ~]# 

解释:当变量var值为空时${var:-a}会吧a作为值,当变量var值不为空时,${var:-a}会吧var的值作为变量

3、${var:+string}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=""
[root@Legion100 ~]# echo ${var:+a}

[root@Legion100 ~]# var=lookback
[root@Legion100 ~]# echo ${var:+a}
a
[root@Legion100 ~]#

解释:${var:+a}的替换规则和上面的相反,即当变量var的值不为空的时将值换成a,当变量var为空时则不替换或者说是替换成变量var的值,即空值。(因为变量var此时为空,所以这两种说法我认为是一样的)

4、${var:=string}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=""
[root@Legion100 ~]# echo ${var:=a}
a
[root@Legion100 ~]# echo ${var:=b}
a
[root@Legion100 ~]# echo $var
a
[root@Legion100 ~]# var=lookback
[root@Legion100 ~]# echo ${var:=a}
lookback
[root@Legion100 ~]# echo ${var:=b}
lookback
[root@Legion100 ~]# echo $var
lookback
[root@Legion100 ~]#

解释:当变量var值为空时,${var:=a}会将其赋值为a,且变量var也被赋值是a了,若变量var不为空时,${var:=string}的值都是变量var的值。(很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。)

5、${var:?string}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

  1 #!/bin/bash
  2 #########################################################################
  3 # File Name: 123.sh
  4 # Author: LookBack
  5 # Email: admin#05hd.com
  6 # Version:
  1 #!/bin/bash
  1 #!/bin/bash
  1 #!/bin/bash
  1 #!/bin/bash
  2 #########################################################################
  3 # File Name: 123.sh
  4 # Author: LookBack
  5 # Email: admin#dwhd.org
  6 # Version:
  7 # Created Time: 2015年07月08日 星期三 20时57分26秒
  8 #########################################################################
  9
 10 var=lookback
 11 echo ${var:?Legion}
 12 var=""
 13 echo ${var:?Legion}
 14 echo test
 15
~/123.sh [FORMAT=unix] [TYPE=SH] [POS=15,1][100%] 15-07-08 - 21:03:06
"123.sh" 15L, 366C [w]
[root@Legion100 ~]# bash 123.sh
lookback
123.sh: line 13: var: Legion
[root@Legion100 ~]# echo $?
1
[root@Legion100 ~]# 

解释:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

6、扩展
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=""
[root@Legion100 ~]# echo ${var:-a}
a
[root@Legion100 ~]# a=Legion
[root@Legion100 ~]# echo ${var:-$a}
Legion
[root@Legion100 ~]# echo ${var:-$(date +%F)}
2015-07-08
[root@Legion100 ~]# 

说明:你们以为a这个位置只能常量?答案是否定的照样可以是其他变量名或者一个命令。

7、${var%pattern}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=lookbacklookbacklookback
[root@Legion100 ~]# echo ${var%b*}
lookbacklookbacklook
[root@Legion100 ~]# 

解释:${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式

8、${var%%pattern}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=lookbacklookbacklookback
[root@Legion100 ~]# echo ${var%%b*}
look
[root@Legion100 ~]# 

解释:${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

9、${var#pattern}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=lookbacklookbacklookback
[root@Legion100 ~]# echo ${var#*b}
acklookbacklookback
[root@Legion100 ~]# 

解释:${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式

10、${var##pattern}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# var=lookbacklookbacklookback
[root@Legion100 ~]# echo ${var#*b}
acklookbacklookback
[root@Legion100 ~]# echo ${var##*b}
ack
[root@Legion100 ~]# 

解释: ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

11、{1,2,3}和{1..n}
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# ls -lh
总用量 72K
-rw-------. 1 root root 10K 5月  31 05:13 anaconda-ks.cfg
-rw-r--r--. 1 root root 44K 5月  31 05:13 install.log
-rw-r--r--. 1 root root 11K 5月  31 05:05 install.log.syslog
[root@Legion100 ~]# touch {a,b,c,d}_testFile
[root@Legion100 ~]# ls -lh
总用量 72K
-rw-------. 1 root root 10K 5月  31 05:13 anaconda-ks.cfg
-rw-r--r--  1 root root   0 7月   9 00:21 a_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 b_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 c_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 d_testFile
-rw-r--r--. 1 root root 44K 5月  31 05:13 install.log
-rw-r--r--. 1 root root 11K 5月  31 05:05 install.log.syslog
[root@Legion100 ~]# touch {1..5}_testFile
[root@Legion100 ~]# ls -lh
总用量 72K
-rw-r--r--  1 root root   0 7月   9 00:21 1_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 2_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 3_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 4_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 5_testFile
-rw-------. 1 root root 10K 5月  31 05:13 anaconda-ks.cfg
-rw-r--r--  1 root root   0 7月   9 00:21 a_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 b_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 c_testFile
-rw-r--r--  1 root root   0 7月   9 00:21 d_testFile
-rw-r--r--. 1 root root 44K 5月  31 05:13 install.log
-rw-r--r--. 1 root root 11K 5月  31 05:05 install.log.syslog
[root@Legion100 ~]# 

二、shell中的中括号(也叫方括号) "[ ]"的用法:

1、单中括号 []

①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。

②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。

③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。

④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。

2、双中括号[[ ]]

①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。


三、shell中的小括号 "( )"的用法:

1、()用法

①、() 数组赋值

Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# a=(a b c d)
[root@Legion100 ~]# echo ${#a[*]}
4
[root@Legion100 ~]# echo ${#a[@]}
4
[root@Legion100 ~]# echo ${a[1]}
b
[root@Legion100 ~]# echo ${a[0]}
a
[root@Legion100 ~]# 

②、() 子shell赋值

Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# (var=lookback;echo $var)
lookback
[root@Legion100 ~]# echo $var

[root@Legion100 ~]#

在子shell中变量var值为lookback,但是在上级shell中就不是这个值,可以看出是在子shell中有效的赋值

③、() 命令集合结果重定向

Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# (echo "a";echo "b"; ) | awk '{print NR,$0}'
1 a
2 b
[root@Legion100 ~]# 

2、$()用法
这个就不多说了应该都知道
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# echo "$(ls -l)"
总用量 72
-rw-------. 1 root root 10161 5月  31 05:13 anaconda-ks.cfg
-rw-r--r--. 1 root root 44528 5月  31 05:13 install.log
-rw-r--r--. 1 root root 10260 5月  31 05:05 install.log.syslog
[root@Legion100 ~]# date
2015年 07月 08日 星期三 23:48:26 CST
[root@Legion100 ~]# echo "date"
date
[root@Legion100 ~]# echo "$(date)"
2015年 07月 08日 星期三 23:48:40 CST
[root@Legion100 ~]# 

3、(())用法
Linux之shell中的大括号、中括号、小括号的使用详解+多示例

[root@Legion100 ~]# echo $((3+2))
5
[root@Legion100 ~]# echo $((10/2))
5
[root@Legion100 ~]# echo $((3*2))
6
[root@Legion100 ~]# echo $((3-2))
1
[root@Legion100 ~]# echo $((25>3 ? 2:3))
2
[root@Legion100 ~]# echo $((25<3 ? 2:3))
3
[root@Legion100 ~]# echo $((a=2+3))
5
[root@Legion100 ~]# echo $a
5
[root@Legion100 ~]# echo $((a+=2))
7
[root@Legion100 ~]# echo $a
7
[root@Legion100 ~]# echo $((a+=2))
9
[root@Legion100 ~]# echo $a
9
[root@Legion100 ~]# 
lookback

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: