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, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。

 
posted @ 2020-11-28 11:56  小匡程序员  阅读(890)  评论(0编辑  收藏  举报