shell中各种括号用法

一.小括号

  • 表示整体,里面可以包含逻辑
grep -E "^(s|S)" /etc/init.d/functions #以s或S开头的行
grep -E "^(root|laowang)\>" /etc/passwd|cut -d : -f7 #查看用户名是root或laowang的shell
grep -E "(root)+" /etc/passwd #至少包含一个root的行
  • 后项引用
echo  "/etc/sysconfig/-network-scripts/" |sed -r 's@^(.*/)([^/]+/?)@\1@'  取目录
  • 在shell脚本里表示开子进程
[ $# -ne 0 ] && (echo "error";exit) #这样不会退出,因为小括号开了子进程,不会退出当前进程
[ $# -ne 0 ] && { echo error;exit; } #这样可以,注意大括号两边有空格
  • 双层小括号

可以进行算数运算、比较,可以进行逻辑运算,但不支持 -a -o ! 等逻辑运算

if (($num <= 127 & $num > 0)); then
       echo OK
fi

二.中括号

2.1单中括号[]

等价于test,注所以[和]的前后需要加空格

2.2双中括号[[ ]]

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

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

  ③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

三.大括号

3.1、常规用法

  ①大括号拓展。(通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt

ls {ex1,ex2}.sh
ex1.sh ex2.sh
ls {ex{1..3},ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
ls {ex[1-3],ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh


3.2字符串提取&替换  ②代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。

第一种模式:${var:num},shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。

第二种模式:${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。

第三种模式:${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。

第四种模式:${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。

3.3正则表达式

  • 表示前面模式匹配的次数
ifconfig | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" #搜索IP
  • 四、符号$后的括号

(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。

(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。

(3)$((expression)) 和`expression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。

猜你喜欢

转载自blog.csdn.net/LinearF/article/details/81388568
今日推荐