Linux:shell脚本:基础使用(10)《(),[],{}分别有上面什么作用》

单小括号()

命令组:组合多条命令一起执行,并按照顺序执行。

[root@localhost ~]# (umask 0077;mkdir -p test;ls -ld test)
drwx------ 2 root root 6 1月  22 15:05 test
[root@localhost ~]# 

替换命令:效果等于反撇,在命令中执行命令,并将执行结果交给命令处理。

[root@localhost ~]# rpm -qf $(which ifconfig)
net-tools-2.0-0.25.20131004git.el7.x86_64

用于初始化数组:如arr=(a b c d)

[root@localhost ~]# arr=(a b c d)
[root@localhost ~]# 

 双小括号(())

计算其他进制(二、八、十、十六)的数到十进制:

[root@localhost ~]# echo $((2#11))
3
[root@localhost ~]# echo $((8#11))
9
[root@localhost ~]# echo $((10#11))
11
[root@localhost ~]# echo $((16#11))
17
[root@localhost ~]# echo $((16#1f))
31
[root@localhost ~]#
[root@localhost ~]#

加减乘除取摸运算

[root@localhost ~]# echo $((1+1))
2
[root@localhost ~]# echo $((2-1))
1
[root@localhost ~]# echo $((2*1))
2
[root@localhost ~]# echo $((2/1))
2
[root@localhost ~]# echo $((2%1))
0
[root@localhost ~]# 

重新定义变量:

[root@www ~]# a=5;((a++));echo $a

6

算术运算比较

双括号内的变量可以不使用$,表达式用分号分开:

[root@www ~]# for i in {0..4};do echo $i;done

[root@www ~]# for i in $(seq 0 4);do echo $i;done

[root@www ~]# for ((i=0;i<5;i++));do echo $i;done  ##上述三种都是一样的效果

[root@www ~]# i=10

[root@www ~]# if ((i>5));then echo $i;fi

[root@www ~]# if [ $i -gt 5 ];then echo $i;fi  ##两个if的效果相同

 


中括号[  ] 

条件表达式 

[root@www ~]# [ -f /etc/hosts ]&&echo ok

[root@www ~]# test -f /etc/hosts &&echo ok

字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。

[root@www ~]# i=1                         121  ##case中使用的[0-9]|[a-z]|[A-Z]表示正则

[root@www ~]# case $i in [0-9]) echo "number";  ;; [a-z]|[A-Z]) echo "alph";  ;; esac


双中括号[[  ]]

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

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

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

[root@www ~]# a=3

[root@www ~]# if [ $a != 1 && $a != 2 ];then echo $a;fi    ##报错

-bash: [: missing `]'

[root@www ~]# if [[ $a != 1 && $a != 2 ]];then echo $a;fi   ##成功执行

3

[root@www ~]# if [ $a != 1 ] && [ $a != 2 ];then echo $a;fi    ##执行成功

3

花括号{  }

常规用法:

[root@www ~]# touch {a..z}.mp{3..5}                               ##..表示分割顺序文件列表

[root@www ~]# ls {{a..e},h,y,z}.mp4 

a.mp4  b.mp4  c.mp4  d.mp4  e.mp4  h.mp4  y.mp4  z.mp4

定义函数:代码块,又被称为内部组,这个结构事实上创建了一个匿名函数 。与小括号中的命令不同,花括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。


 字符串提取和替换

${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

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

[root@www ~]# var=www.linux123.cn

[root@www ~]# echo ${var:4}

linux123.cn

[root@www ~]# echo ${var:(-2)}

cn

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

[root@www ~]# var=www.linux123.cn

[root@www ~]# echo ${var:4:5}

linux

[root@www ~]# echo ${var:1:3}

ww.

[root@www ~]# echo ${var:0:3}

www   

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

[root@www ~]# var=www.linux.com

[root@www ~]# echo ${var/www/dns}

dns.linux.com

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

[root@www ~]# var=www.linux12n.cn

[root@www ~]# echo ${var/n/N}

www.liNux12n.cn

[root@www ~]# echo ${var//n/N}

www.liNux12N.cN

多条命令执行

单小括号:(cmd1;cmd2;cmd3)新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。

[root@www tmp]# (touch index.html;rm -rf index.html;ls -l;)

单大括号:{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 括号两侧必须有空格。

[root@www tmp]# {touch index.html;rm -rf index.html;ls -l;}  ##开始的{后无空格报错

-bash: syntax error near unexpected token `}'

[root@www tmp]# { touch index.html;rm -rf index.html;ls -l  }

[root@www tmp]# { touch index.html;rm -rf index.html;ls -l;  }  ##最后一条命令必须;

总用量 0

注:对{}和()而言, 括号中的重定向符只影响该条命令,而括号外的重定向符影响到括号中的所有命令。

你可能感兴趣的:(linux,运维,服务器)