linux shell脚本编程

算数运算
Shell允许在某些情况下对算术表达式进行求值
注意:bash 只支持整数,不支持小数

(1) let i=算术表达式
(2) ((i=算术表达式)) 和上面等价
(3) i=$[算术表达式]
(4) i=$((算术表达式))
(5) i=$(expr arg1 arg2 arg3 ...)
(6) declare -i i = 数值
(7) echo '算术表达式' | bc

[root@localhost ~]# let i=10*2
[root@localhost ~]# echo $i
20
[root@localhost ~]# ((j=10+20))
[root@localhost ~]# echo $j
30

随机数生成器变量:

$RANDOM 取值范围:0-32767

生成 0 - 49 之间随机数
echo $[$RANDOM%50]

赋值

+= i+=10 相当于 i=i+10
-= i-=j  相当于 i=i-j
*=
/=
%=
++ i++,++i 相当于 i=i+1
-- i--,--i 相当于 i=i-1

逻辑运算
true, false

1,真
0,假
注意,以上为二进制

与:&:和0相与结果为0,和1相与结果保留原值, 一假则假,全真才真
或: | :和1相或结果为1,和0相或结果保留原值, 一真则真,全假才假
非:!
! 1 = 0
! 0 = 1
异或:^
异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出另一个值Y

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

案例:变量互换

[root@localhost ~]# x=10;y=20;temp=$x;x=$y;y=$temp;echo x=$x,y=$y
x=20,y=10
[root@localhost ~]# x=10;y=20;x=$[x^y];y=$[x^y];x=$[x^y];echo x=$x,y=$y
x=20,y=10

短路运算

短路与 &&

CMD1 && CMD2
第一个CMD1结果为真,第二个CMD2必须要参与运算,才能得到最终的结果
第一个CMD1结果为假,总的结果必定为0,因此不需要执行CMD2

短路或 ||

CMD1 || CMD2
第一个CMD1结果为真,总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为假,第二个CMD2 必须要参与运算,才能得到最终的结果

&&与||组合使用

cmd1 || cmd2 && cmd3  无论命令1或2成功与否,命令3都将执行
一般使用cmd1 && cmd2 || cmd3 这种组合 命令1成功执行命令2,反之执行命令3

案例:
[root@localhost ~]# [ `whoami` = 'root' -a ! -e /data/dir ] && mkdir /data/dir || echo "不成功"
不成功
[root@localhost ~]# [ \( `whoami` = 'root' \) -a \( ! -e /data/dir \) ] && mkdir /data/dir || echo "不成功"
不成功

条件测试命令
若真,则状态码变量 $? 返回0
若假,则状态码变量 $? 返回1
条件测试命令

  • test EXPRESSION
  • [ EXPRESSION ] #和test 等价,建议使用 [ ]
  • [[ EXPRESSION ]] 增强版的 [ ], 支持[ ]的用法,且支持扩展正则表达式和通配符

注意:EXPRESSION前后必须有空白字符
案例:

[root@localhost ~]# test -a /etc/issue
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ test -a /etc/issue ]
[root@localhost ~]# [ -a /etc/issue ]
[root@localhost ~]# echo $?
0
一般使用-e用来判断文件是否存在

判断字符串

判断字符串是否为空

-z  对于-z选项,字符串为空串与字符串变量不存在,结果都为真
-n或者直接写字符串表示不空为真
[root@localhost ~]# str=xyz; [ -z $str ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# str=xyz;unset str;[ -z $str ];echo $?
0
[root@localhost ~]# str="";[ -z $str ];echo $?
0

[root@localhost ~]# str="";[ $str ];echo $?
1
[root@localhost ~]# str="xyz";[ $str ];echo $?
0

使用-z或-n对一个变量判空时,需要注意若直接使用[ -n ${ARG} ]这种形式,若${ARG}中有空格将会报错
案例:
[root@localhost ~]# NAME="I love linux"
[root@localhost ~]# [ $NAME ]
-bash: [: love: binary operator expected
解决方法,使用[[ -n ${ARG} ]]或[ -n "${ARG}" ]
[root@localhost ~]# [ "$NAME" ]
[root@localhost ~]# echo $?
0


判断两个字符串是否相等
[ str1 = str2 ]
str1=str2  表示赋值
[root@localhost ~]# str1=xyz;str2=xy;[ $str1 = $str2 ];echo $?
1
[root@localhost ~]# str1=xyz;str2=xyz;[ $str1 = $str2 ];echo $?
0
在比较字符串时,建议将字符串用引号引起来 若a为空串,等号前是有东西的,语法不会出错 [ = xyz]
[root@localhost ~]# a=xyz;b=xyz;unset a; [ "$a" = "$b" ] && echo equal || echo not equal
not equal

数值测试

-eq 是否等于
-ne 是否不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于

案例:

取出分区利用率最高的
[root@localhost ~]# df | grep "^/dev/sd" | grep -Eo '[0-9]+%' |grep -Eo '[0-9]+' | sort -rn| head -n1
73

同时执行几条命令并将执行结果重定向到文件中

[root@localhost ~]# (ls;hostname) > 1.log
[root@localhost ~]# { who;hostname;} > 2.log

[[]] 用法

[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]中;等号右侧为扩展的正则表达式

[root@localhost ~]# file=abc.sh;[[ $file == *.sh ]] && echo true || echo false
true
[root@localhost ~]# file=abc.sh;[[ "$file" =~ .*\.sh$ ]] && echo true || echo false
true

()与{}的用法

()执行()中的命令时,会开启子进程,只在括号内有效
{} 不开启子进程
[root@localhost ~]# name=x;( name=y;echo $name);echo $name
y
x
[root@localhost ~]# name=x;{ name=y;echo $name;};echo $name
y
y

组合测试

[ EXPRESSION1 -a EXPRESSION2 ] 并且,EXPRESSION1和EXPRESSION2都是真,结果才为真
[ EXPRESSION1 -o EXPRESSION2 ] 或者,EXPRESSION1和EXPRESSION2只要有一个真,结果就为
真
[ ! EXPRESSION ] 取反
说明: -a 和 -o 需要使用测试命令进行,[[ ]] 不支持

案例:
[root@localhost ~]# [ `whoami` = 'root' -a ! -e /data/dir ] && mkdir /data/dir
[root@localhost ~]# ls /data
dir
posted @ 2021-10-26 21:51  咚咚小孩  阅读(46)  评论(0)    收藏  举报