命令组:组合多条命令一起执行,并按照顺序执行。
[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
注:对{}和()而言, 括号中的重定向符只影响该条命令,而括号外的重定向符影响到括号中的所有命令。