在shell脚本编程中算术运算无疑是十分重要的;
bash中执行整数算数运算的命令是let,其语法格式为:
let arg...
arg为单独的算术表达式如+,-,*,/,%,^等所构成的完整的算术表达式;
其中^为平方运算,如2^3表示2的三次方;
let命令可以使用如下方式替代:
((算术表达式))
例如
[[email protected] wjq]# let "a=2*3"
[[email protected] wjq]# echo $a
6
[[email protected] wjq]# (("a=3*3"))
[[email protected] wjq]# echo $a
9
除了简单的加减乘除运算,算术运算中还包括增强型运算方式和特殊的增强型运算方式;
增强型运算方式:
+=:如a+=b-->a=a+b
-+:如a-=b-->a=a-b
*=:如a*=b-->a=a*b
%=:如a%=b-->a=a%b
/=:如a/=b-->a=a/b
转化为let命令运算为:
[[email protected] wjq]# b=5
[[email protected] wjq]# let "a+=b"
[[email protected] wjq]# echo $a
14
[[email protected] wjq]#
特殊增强型运算:
a++:a先将值赋给变量,再+1;
++a:a先+1,再将值赋给变量;
a--:a先将值赋给变量,再-1;
--a:a先-1,再将值赋给变量;
转化为let命令的运算方式为:
[[email protected] wjq]# a=4
[[email protected] wjq]# b=5
[[email protected] wjq]# let "a++"
[[email protected] wjq]# let "a+=b"
[[email protected] wjq]# echo $a
10
算术运算方法:
① let VAR=算术表达式
#let “B=5+4”
#echo $B
将算术表达式先行进行算术运算,并将运算得到的结果保存到变量VAR;
变量:存储数据的容器
弱变量:弱类型变量,默认是字符型变量,数值型(不包括浮点型)
② VAR=$[算术表达式]
[[email protected] wjq]# a=$[a*b]
[[email protected] wjq]# echo $a
50
③ VAR=$((算术表达式))
算术表达式中如果有引用就用$引用,也可以省略
[[email protected] wjq]# a=$((a*b))
[[email protected] wjq]# echo $a
250
④ exper ARGU1 ARGU2 ARGU3
ARGU1和ARGU3 必须是数值
ARGU2是运算符
⑤ echo “算术表达式” | bc(bc命令相当于计算器)
[[email protected] wjq]# echo "3*4" | bc
12
条件测试语句:
条件测试有三种测试语句
一是test命令;
二是用一堆方括号将其括起来,而这是完全等价的;
test -f "/etc/passwd" 完全等价于 [ -f "/etc/passwd" ]
三是[[条件表达式]];
这三种表达式可以和多种系统运算符结合使用,这些系统运算符可以分为四类:数值测试运算符,字符串测试运算符,文件状态测试运算符,逻辑测试运算符;
下列四种运算符皆在此使用第二种表达方式表示;
数据测试运算符:使用双目操作符进行运算;
[ n1 -eq n2 ]:测试n1和n2是否相等,相等为真,不等为假
[ n1 -ne n2 ]:测试n1和n2是否不相等,不等为真,相等为假;
[ n1 -lt n2 ]:测试的n1和n2,左边的是否小于右边的,小于为真,大于为假;
[ n1 -gt n2 ]:测试的n1和n2,左边的是否大于右边的,大于为真,小于为假;
[ n1 -le n2 ]:测试的n1和n2,左边的是否小于等于右边的;
例
[[email protected] wjq]# [ "$a" -eq 0 ] && echo "a等于0" || echo "a不等于0"
a不等于0
字符串测试运算符:
使用单目运算符进行操作;
-z ‘n1’:如果字符串长度为0,则测试条件为真;
-n ‘n1’:如果字符串长度不为0;非空为真,空为假;
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# [ -z "$a" ] && echo "a等于0" || echo "a不等于0"
a不等于0
使用双目运算符进行操作:
==|=:被测试的两个字符串是否相等,相同为真,不同为假;
!=:被测试的两个字符是否不相同,不同为真,相同为假;
>:被测试的两个字符串在转化为ascll码后的二进制数据;左边是否大于右边,大于为真,小于为 假;
>:被测试的两个字符串在转化为ascll码后的二进制数据,左边是否小于右边,小于为真,大于为 假;
例
①
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# b=‘string‘
[[email protected] wjq]# [ "$a" == "$b" ] && echo "a等于b" || echo "a不等于b"
a等于b
②
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# b=‘str‘
[[email protected] wjq]# [ "$a" != "$b" ] && echo "a不等于b" || echo "a等于b"
a不等于b
③
[[email protected] wjq]# a=‘string‘
[[email protected] wjq]# b=‘str‘
[[email protected] wjq]# [ "$a" > "$b" ] && echo "a大于b" || echo "a小于b"
a大于b
文件状态测试运算符:单目测试运算符;
文件存在性测试,如果测试的文件存在为真,不存在为假;
-a|-e:
例
[[email protected] wjq]# [ -a ./8yu ] && echo "文件存在" || echo "文件不存在"
文件存在
文件类型测试(测试存在性)
-b file:若文件存在并且为块设备,则测试为真;
-c file:若文件存在并且为字符设备,则测试为真;
-d file:若文件存在并且为目录设备,则测试为真;
-f file:若文件存在并且为文本文档,则测试为真;
-h|-L file:若文件为存在并且为符号链接文件,则测试为真;
-p file:若文件存在并且为套接字文件,则测试为真;
例
[[email protected] wjq]# [ -f ./8yu ] && echo "文件为文本文档" || echo "文件不是文本文档"
文件为文本文档
文件的访问权限设置:
-r file:若文件存在并且是用户可读,则测试为真;
-w file:若文件存在并且是用户可写,则测试为真;
-x file:若文件存在并且是用户可执行的,则测试为真;
例
[[email protected] wjq]# [ -r ./8yu ] && echo "文件可读" || echo "文件不可读"
文件可读
[[email protected] wjq]# [ -w ./8yu ] && echo "文件可写" || echo "文件不可写"
文件可写
[[email protected] wjq]# [ -x ./8yu ] && echo "文件可执行" || echo "文件不可执行"
文件可执行
文件特殊权限标识测试:
-u file:若文件存在并且设置了SUID权限,则测试为真;否则为假;
-g file:若文件存在并且设置了SGID权限,则测试为真;否则为假;
-k file:若文件存在并且设置了sticky权限,则测试为真;否则为假;
例
[[email protected] wjq]# [ -u ./8yu ] && echo "文件存在SUID权限" || echo "文件不存在SUID权 限"
文件不存在SUID权限
[[email protected] wjq]# [ -g ./8yu ] && echo "文件存在SGID权限" || echo "文件不存在SGID权 限"
文件不存在SGID权限
[[email protected] wjq]# [ -k ./8yu ] && echo "文件存在STICKY权限" || echo "文件不存在 STICKY权限"
文件不存在SUID权限
文件所有权测试:
-O file:若文件存在并且其属主为当前有效用户,则测试为真;否则为假;
-G file:若文件存在并且其属组是为当前有效用户,则测试为真;否则为假;
例
[[email protected] wjq]# [ -O ./8yu ] && echo "文件存在且其属主为当用户" || echo "文件不存 在"
文件不存在
[[email protected] wjq]# ls ./8yu
./8yu
[[email protected] wjq]# ls -l ./8yu
-rwxrw-r--. 1 wjq wjq 71 3月 27 20:39 ./8yu
文件内容是否为空:
-s file:若文件存在并且内容不为空,存在且内容不为空则为真;否则为假;
时间戳测试:
-N file:被测试文件自从上一次被修改之后,是否被修改过;
逻辑测试运算符:
① !:逻辑非(NOT),他放在任何表达式前,是原来为真的表达式变为假,使原来为假的表达式变为真;
② -a:逻辑与(AND),他放在两个逻辑表达式之间,仅当两个都为真时,结果才为真;
例:
[ -f ./8yu -a -f ./aa ]
③ -o:逻辑或(OR),他放在两个逻辑表达式中间,其中只要有一个为真,结果才为真;
例:
[ -f ./8yu -o -f ./aa ]
两种表达式等价:
第一种表达式:
[ -O /tmp/test ] && [ -s /tmp/test ]
[ -O /tmp/test ] || [ -s /tmp/test ]
第二种表达式:
[ -O /tmp/test -a -s /tmp/test ]
[ -O /tmp/test -o -s /tmp/test ]
[ ! -O /tmp/test ]