shell C语言表达式,shell中各类括号(),[],(()),[[]],{}等的做用大全及示例

文章目录

1、()

一、命令组

二、命令替换

三、初始化数组

2、(())

一、C语言规则运算

二、重定义变量值

三、算术比较

3、[]

一、条件判断

二、字符范围

三、数组下标

4、[[]]

一、条件判断

二、返回状态码

5、{}

一、字符扩展

二、代码块

三、特殊替换结构

四、模式匹配截断

五、长度截断

1、()

一、命令组

链接多个命令组,用;隔开,最后一个命令后;可加可不加。括号中的命令会新开一个子shell顺序执行,因此里面的操做对括号外主进程无关。java

a=0

(a=1;b=2;echo $a) # 子进程内输出a为1

echo $a # 主进程,输出a为0

1

2

3

二、命令替换

格式为 $(command),至关于 command。shell遇到此格式,会先执行 command 命令,获得标准输出,再将此输出放回到原来命令。正则表达式

SCRIPTPATH=$(dirname $0) # sh脚本的相对目录

1

三、初始化数组

Shell 数组用括号来表示,元素用"空格"符号分割开。shell

array=(a b c)

echo ${array[1]} # 输出b

1

2

2、(())

一、C语言规则运算

表达式 $((exp)),其中exp只要符合C语言规则的运算符便可,包括加减乘除、+=、<=、>=等。数组

进行不一样进位(如二进制、八进制、十六进制)运算时,输出结果会全都自动转化成十进制。bash

echo $((2*2+(1-2))) # 输出3

a=1

echo $((a++)) # 输出2,且今后以后a=2

echo $((2#10+4)) # 输出6,在10前面的2#表示这是个二进制

echo $((a<2)) # 输出1。若是为假,则输出0。

1

2

3

4

5

二、重定义变量值

在((exp))中能够对变量进行定义或从新赋值,且以后脚本所有有效(不是像()那样只在子进程有效)。app

a=1

((a=2))

echo $a # 输出2

1

2

3

三、算术比较

在((exp))中能够进行算术比较(不能进行字符串比较),双括号中的变量能够省略$符号前缀,固然也能够带着。ide

a=1

((a==1)) && echo "true" # 输出 true

(($a==1)) && echo "true" # 输出 true

1

2

3

3、[]

一、条件判断

[] 本质上是 test 语句,[是调用test的命令标识,]是关闭条件判断,如:函数

a="abc"

if [ -n "$a" ]; then echo "true"; fi # 输出true,注意[]内-n或者-z时字符串两边必须加上双引号

if test -n "$a"; then echo "true"; fi # 输出true,注意test内-n或者-z时字符串两边必须加上双引号

1

2

3

二、字符范围

用做正则表达式的一部分,描述一个匹配的字符范围,如删除一个字符串中的全部数字:.net

echo "ap1p23le" | tr -d "[0-9]" # 输出 apple

echo [a-b].txt # 输出:a.txt b.txt,前提是两个文件都存在。命令行

可是若是当前路径只存在a.txt或b.txt,则只会输出存在的文件。

若是两个文件均不存在,则输出固定字符串:[a-b].txt

1

2

3

4

三、数组下标

在一个array后,做为引用数组元素的下标,如

a=(1 2 3)

echo ${a[0]} # 输出:1

echo ${a[*]} # 输出:1 2 3

1

2

3

4、[[]]

一、条件判断

使用[[]]条件判断结构,与[]有如下区别:

本质上,[]和test是命令,而[[]]是关键字,因此重定向等字符在[]中会被认为成重定向,而在[[]]中是比较符号的意思。

&&、||、 操做符可以正常存在于[[]]条件判断结构中,可是若是出如今[]结构中的话,会报错。好比能够直接使用if [[ $a != 1 && $a != 2 ]], 若是不使用双括号, 则为if [ $a != 1] && [ $a != 2 ]或者if [ $a != 1 -a $a != 2 ]

[[]]支持字符串的模式匹配,[]不支持。使用=或==进行字符串比较,等号右边的能够做为一个模式,好比[[ "hello" == hell? ]]为真。模式匹配不能加引号,不然会做为固定字符串,如[[ "hello" == "hell?" ]]为假。

[[]]支持算术扩展,而[]不支持。如if [[ 1+2 -eq 3 ]],而if [ 1+2 -eq 3 ]则会报错。

二、返回状态码

本质上,bash把[[]]中的表达式看做一个单独的元素,并返回一个退出状态码。

好比:

[[ 1 -gt 0 ]]

echo $? # 输出0

[[ 1 -gt 2 ]]

echo $? # 输出1

1

2

3

4

能够看到,若是[[]]内的表达式为真,则返回退出码0,这也是其余全部命令执行正常时所返回的退出码。

所以,若是用[[]]做为if的判断条件,道理是和判断一个命令或函数是否顺利执行是同样的。

5、{}

一、字符扩展

{}能够做为通配符进行扩展,有两种用法:

echo {a,b}.txt 输出a.txt b.txt。与echo [a-b].txt区别在于,后者只输出存在的文件名,而前者不论是不是存在此文件,永远都会输出a.txt b.txt,由于{}的字符扩展和是否是文件名没有关系。

echo {a..c}.txt输出a.txt b.txt c.txt。

这两种扩展也能够用于循环:

$ for i in {0,2};do echo $i;done

0

2

$ for i in {0..2};do echo $i;done

0

1

2

1

2

3

4

5

6

7

二、代码块

又被称为内部组,格式为{ cmd1;cmd2;},这个结构事实上建立了一个匿名函数 。

{}与()均可以执行一连串命令,区别以下:

()会新开一个子进程,括号内命令与括号外无关。{}内的命令不会新开一个子进程运行,即脚本余下部分仍可以使用括号内变量。

二者括号内的命令间都要用;隔开,但()最后一个命令的分号无关紧要,但{}最后一个也必须有分号。

{}的第一个命令和左括号{之间必需要有一个空格(右括号}无此要求),而()两个括号的空格都可有可无。

三、特殊替换结构

有4种特殊的替换结构:${var:-string},${var:+string},${var:=string},${var:?string}

(1)${var:-string}表示若变量var不为空,则等于var的值,不然等于string的值。

好比:

a=''

b="bbb"

echo ${a:-foo} # 输出:foo

echo ${a:-"foo"} # 输出:foo

echo ${a:-$b} # 输出:bbb

1

2

3

4

5

(2)${var:=string}的替换规则与${var:-string}相同,不过多了一步操做:若var为空时,还会把string的值赋给var。

好比:

a=''

b="bbb"

echo ${a:=$b} # 输出:bbb

echo $a # 输出:bbb

1

2

3

4

(3)${var:+string}的替换规则和上面的相反,表示若变量var不为空,则等于string的值,不然等于var的值(即空值)。

好比:

a=""

b="bbb"

echo ${a:+"foo"} # 输出为空

echo ${b:+"foo"} # 输出:foo

1

2

3

4

(4)${var:?string}表示若变量var不为空,则等于var的值,不然把string输出到标准错误中,并从脚本中退出。

咱们可利用此特性来检查是否设置了变量的值,好比一个脚本test.sh内容以下:

#!/bin/bash

a=""

b="bbb"

echo ${a:?"warn:string is null"}

echo ${b:?"warn:string is null"}

echo "done"

1

2

3

4

5

6

而后在命令行中执行命令:

$ sh test.sh > out.log 2> err.log # 标准输出至out.log,标准错误输出至err.log

$ cat out.log

aaa

$ cat err.log

test.sh: line 5: b: warn:string is null

1

2

3

4

5

能够看到,out.log中没有done,所以脚本执行到Line 5的错误就提早退出了。

四、模式匹配截断

有4种模式:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}

(1)${var%pattern}表示看var是否以模式pattern结尾,若是是,就把var中的内容去掉右边最短的匹配模式。

(2)${var%%pattern}表示看var是否以模式pattern结尾,若是是,就把var中的内容去掉右边最长的匹配模式。

(3)${var#pattern}表示看var是否以模式pattern开始,若是是,就把var中的内容去掉左边最短的匹配模式。

(4)${var##pattern}表示看var是否以模式pattern开始,若是是,就把var中的内容去掉左边最长的匹配模式。

好比:

a="apple"

echo ${a%"le"} # 去掉右边固定"le",输出:app

echo ${a%p} # 去掉右边最短匹配,输出:ap

echo ${a%%p} # 去掉右边最长匹配,输出:a

echo ${a#p} # 去掉左边最短匹配,输出:ple

echo ${a##p} # 去掉左边最长匹配,输出:le

1

2

3

4

5

6

五、长度截断

有2种模式:${var:num},${var:num1:num2}

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

(2)${var:num1:num2}表示从var中第num1个位置开始提取长度为num2的子串。num1从0开始。

好比:

a="apple"

echo ${a:2} # 去掉前2个,输出:ple

echo ${a: -2} # 保留后2个,输出:le

echo ${a:1:3} # 保留从1开始的3个字符,输出:ppl

————————————————

版权声明:本文为CSDN博主「HappyRocking」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。

原文连接:https://blog.csdn.net/HappyRocking/java/article/details/90609554

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值