shell易错语法:()、(())、[]、[[]]、{} 的作用
参考:
https://www.runoob.com/w3cnote/linux-shell-brackets-features.html(菜鸟)
https://blog.csdn.net/JineD/article/details/119945587(shell 中 ()、(())、[]、[[]]、{} 的作用)
单小括号 ()
命令组
括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
#!/bin/bash (echo 1;echo 2)
用于初始化数组
array=(a b c d)
命令替换
命令替换是指 将命令的输出结果赋值给某个变量,shell中有两种方式可以完成命令替换:反引号`` 和 $()
var=`commands` var=$(commands)
举例:
stime=`date +%s`
echo "$stime"
sleep 1s
etime=$(date +%s)
echo "$etime"
rtime=$((etime - stime))
echo "$rtime"
双小圆括号(())
一句话就是,允许对算术表达式的扩展求值;双括号(())表示高级数学表达数处理、双方括[[]]号表示高级字符串处理。
扩展求值
只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符 a=5; ((a++)) #$a重定义为6 (( b = 23 )) #C风格的变量赋值if ((b==23)) #用在比较运算符中,可以省略$ then echo $b,"yes" fi
单中括号[]
等同于test命令
Test和[]中可用的,字符串比较运算符只有==和!=,整数比较使用 == ,!=或-eq,-gt这种形式
a=10 b=20 if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi
条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。双等于两笔那也要有空格
array结构
my_array=(A B "C" D) #设值 array_name[0]=value0 array_name[1]=value1 #取值 ${array_name[index]}
双中括号[[]]
增强方括号用法, 常用于字符串的比较. 主要用于条件测试, 双括号中的表达式可以使用&&, ||, <, >等C语言语法
可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]
与单中括号的区别
1,在[[ 中还是尽量带上 $ 符号不会出错 2,shell 中尽量将 各种关键字 、表达式 ,运算符 和 变量参数 等用空格隔开,否则变量替换后,中间没有空格隔开就会成为一个连续的字符 ,(比如表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]) 3,[[ 或者 [ 与里面的表达式 要有 空格隔开 , (( 与里面的表达式 可以不用空格隔开
大括号{}
扩展
# echo {ex1,ex2}.sh ex1.sh ex2.sh # echo {ex{1..3},ex4}.sh ex1.sh ex2.sh ex3.sh ex4.sh
字符串提取和替换
${var:num} #num位置:从0开始的话从第num个开始(含第num个)到结束(去掉前面num个) ${var:num1:num2} #num1位置,num2长度 ${var/pattern/new} #/替换一个 ${var//pattern/new} #//替换全部 #eg [root@centos ~]# var=/home/centos [root@centos ~]# echo $var /home/centos [root@centos ~]# echo ${var:5} /centos [root@centos ~]# echo ${var: -6} centos [root@centos ~]# echo ${var:(-6)} centos [root@centos ~]# echo ${var:1:4} home [root@centos ~]# echo ${var/o/h} /hhme/centos [root@centos ~]# echo ${var//o/h} /hhme/cenths
字符串截取
${var#key} 从头开始删除,最短匹配 ${var##key} 从头开始删除,最长匹配 ${var%key} 从尾删除,最短匹配 ${var%%key} 从尾删除,最长匹配 USR=$(head -1 /etc/passwd) echo $USR #root:x:0:0:root:/root:/bin/bash echo ${USR#*:} # x:0:0:root:/root:/bin/bash echo ${USR##*:} # /bin/bash echo ${USR%:*} # root:x:0:0:root:/root echo ${USR%%:*} # root
符号$后的括号
(1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
(2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。
(3)$((expression)) 和`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
多条命令执行
(1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
(2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。