【Shell编程】 运算符

时间:2021-08-10 14:03来源:未知 作者:中博IT教育

运算符 一 算数运算符 运算符 + - * / % 算数运算符需要配合下述操作使用 # 浮点运算 bc # 整数运算 expr $(()) $[] let 详解如下 1、bc是比较常用的linux计算工具了,而且支持浮点运算 [root@l
运算符
一 算数运算符
运算符
 
+
 
-
 
*
 
/
 
%
 
算数运算符需要配合下述操作使用
 
# 浮点运算
bc  
 
# 整数运算
expr
$(())
$[]
let
详解如下
 
1、bc是比较常用的linux计算工具了,而且支持浮点运算
 
[root@localhost ~]# res=`echo 1+1 | bc`
[root@localhost ~]# echo $res
2
 
[root@localhost ~]# res=`echo 10 % 3 | bc`
[root@localhost ~]# echo $res
1
 
[root@localhost ~]# res=`echo 1.2+1.3|bc`
[root@localhost ~]# echo $res
2.5
 
[root@localhost ~]# res=`echo 5.0+3.0|bc`
[root@localhost ~]# echo $res
8.0
 
[root@localhost ~]# res=`echo "scale=2;5.0/3.0"|bc`
[root@localhost ~]# echo $res
1.66
 
[root@localhost ~]# res=`echo "scale=2;5.0/6.0"|bc`
[root@localhost ~]# echo $res
.83
2、expr不支持浮点数计算。而且要注意数字与运算符中的空格
 
[root@localhost ~]# res=`expr 5 / 3`  # 不支持浮点计算
[root@localhost ~]# echo $res
1
 
[root@localhost ~]# res=`expr 1+1`  # 注意:要有空格
[root@localhost ~]# echo $res
1+1
[root@localhost ~]# res=`expr 1 + 1`
[root@localhost ~]# echo $res
2
3、$(()) 同expr,不支持浮点数运算
 
# 例如:
[root@localhost ~]# echo $((1+1))
2
[root@localhost ~]# echo $((1.0+2.0))  # 不支持浮点运算符
-bash: 1.0+2.0: 语法错误: 无效的算术运算符 (错误符号是 ".0+2.0")
           
# 注意:
echo $(($num1+$num2))  # 也可以简写为 echo $((num1+num2)) 
echo $(((5-3)*2))  # 可以嵌套括号    
4、$[]同expr以及$(()),不支持浮点运算
 
[root@egon ~]# echo $[$num1+$num2]  # 等同于 echo $[num1+num2]
333
[root@egon ~]# echo $[1.3+3.1] 
-bash: 1.3+3.1: 语法错误: 无效的算术运算符 (错误符号是 ".3+3.1")
5、let 不支持浮点数运算,而且不支持直接输出,只能赋值
 
[root@localhost ~]# let res=1+1
[root@localhost ~]# echo $res
2
[root@localhost ~]# 
[root@localhost ~]# let res=50/5
[root@localhost ~]# echo $res
10
[root@localhost ~]# let c=1.3*3
-bash: let: c=1.3*3: 语法错误: 无效的算术运算符 (错误符号是 ".3*3"
6、强调:整数与非整数之间运算会报错
 
[root@egon ~]# expr 1 + a
expr: 非整数参数
[root@egon ~]# expr 1 + 1.3
expr: 非整数参数
练习题
 
#1、脚本案例: 编写小脚本, 可以实现2位数加减乘除运算
[root@egon shell]# cat a.sh 
#!/bin/bash
 
a=$1
b=$2
 
[ $# -ne 2 ] && {
    echo "请输入两位数字信息"
    exit
}
 
echo "a-b=$((a-b))"
echo "a+b=$((a+b))"
echo "a*b=$((a*b))"
echo "a/b=$((a/b))"
 
# 2、脚本案例: 编写判断输入参数是否是整数信息脚本
#!/bin/bash
 
a=$1
expr $a + 0 &>/dev/null  # 只有整型加0才不会报错,浮点数及字符与0详解都会报错
[ $? -eq 0 ] && echo "输入的是整数信息" || echo "输入的是非整数信息"
 
# 3、如何利用脚本计算1+2+3+4..10总和数值
方法一:
seq -s "+" 10|bc
 
方法二:
echo {1..10}|tr " " "+"|bc
 
方法三:
awk 'BEGIN{for (i=1; i<=10; i++) a=a+i; print a}'
二 测试运算符
测试命令:test,详细可用man test查询
 
测试符号:[],注意只有一层中括号,中括号内左右两侧必须要有空格
 
test与[]效果都一样,参数也都一样
 
2.1 测试文件状态
-d 目录
 
[root@egon ~]# test -d /etc/ ; echo $?
0
 
[root@egon ~]# [ -d /etc ];echo $?  # 注意[]内左右两侧要有空格
0
 
ps:下面关于[]用法都与test一样,不再举例
-s 文件长度 > 0、非空
 
[root@egon ~]# touch a.txt
[root@egon ~]# test -s a.txt ;echo $?  # 文件为空则返回假
1
 
[root@egon ~]# test -s /etc/passwd ;echo $?  # 文件不为空则返回假
0
-f 正规文件
 
[root@egon ~]# test -f /etc/passwd;echo $?
0
-w 可写
 
[egon@egon ~]$ touch a.txt
[egon@egon ~]$ chmod a-w a.txt
[egon@egon ~]$ [ -w a.txt ];echo $?  # 返回假,注意,如果是root用户,无论如何都有写权限
1
-r 可读
 
[egon@egon ~]$ ll a.txt 
-r--r--r--. 1 egon egon 292 8月  17 21:48 a.txt
[egon@egon ~]$ test -r a.txt;echo $?
0
-x 可执行
 
[egon@egon ~]$ ll a.txt 
-r--r--r--. 1 egon egon 292 8月  17 21:48 a.txt
[egon@egon ~]$ test -x a.txt;echo $?
1
-L 符号连接
 
[root@egon ~]# ll -d /lib64
lrwxrwxrwx. 1 root root 9 7月  14 03:33 /lib64 -> usr/lib64
[root@egon ~]# test -L /lib64;echo $?
0
-u 文件有 suid 位设置
 
[root@egon ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd
[root@egon ~]# [ -u `which passwd` ];echo $?
0
[root@egon ~]# [ -u `which ls` ];echo $?
1
2.2 字符串测试
== 两个字符串相等
 
[root@egon ~]# [ "aaa" == "aaa" ];echo $?
0
!= 两个字符串不相等
 
[root@egon ~]# [ "aaa" != "aaa" ];echo $?
1
-z 字符串长度为零
 
[root@egon ~]# ip=""
[root@egon ~]# [ -z "$ip" ];echo $?  # 注意引号
0
[root@egon ~]# ip='1.1.1.1'
[root@egon ~]# [ -z "$ip" ];echo $?
1
-n 字符串长度不为零
 
[root@egon ~]# [ -n "$ip" ];echo $?  # 注意加引号
1
2.3 测试数值
test与[]也可以测试数值,与 [[]]和(())效果一样,下一小节会详细介绍[[]]和(())
 
-eq 等于
 
-ne 不等于
 
-gt 大于
 
-lt 小于
 
-ge 大于等于
 
-le 小于等于
 
-a并且
 
-o或者
 
[root@egon ~]# [ 10 -eq 10 ];echo $?
0
[root@egon ~]#  [ 10 -eq 10 -a 10 > 3 ];echo $?
0
 
# 1、示例:
[root@egon ~]# disk_use=$(df -P |grep '/$' |awk '{print $5}' |awk -F% '{print $1}')
[root@egon ~]# [ $disk_use -gt 10 ] && echo "warn......"
warn......
 
[root@egon ~]# [ $(id -u) -eq 0 ] && echo "当前是超级用户" || echo "you不是超级用户"
当前是超级用户
三 关系运算符
<
 
>
 
<=
 
>=
 
==
 
!=
 
&&
 
||
 
上述关系运算符需要配合(())使用(注意(())属于C语言风格的比较),最终都是用来当if判断或者while循环的条件
 
[root@egon ~]# x=100
 
[root@egon ~]# (($x>10))
[root@egon ~]# echo $?
0
 
[root@egon ~]# (($x < 10));echo $?
1
 
[root@egon ~]# (($x == 100));echo $?
0
 
[root@egon ~]# (($x != 100));echo $?
1
 
[root@egon ~]# (($x != 100)) && (("egon" == "egon"))
[root@egon ~]# echo $?
1
 
[root@egon ~]# (($x != 100)) || (("egon" == "egon"))
[root@egon ~]# echo $?
0
 
[root@egon ~]# (($x != 100 && "egon" == "egon"));echo $?
1
 
[root@egon ~]# (($x != 100 || "egon" == "egon"));echo $?
0
四 赋值运算符
=
 
[root@egon ~]# x=10
[root@egon ~]# echo $x
10
+=
 
[root@egon ~]# x=10
[root@egon ~]# ((x%3))
[root@egon ~]# echo $x
10
[root@egon ~]# ((x%=3))
[root@egon ~]# echo $x
1
*=
 
同上
/=
 
同上
%=
 
同上
五 补充
5.1 补充[[]]
[[]]与[]基本一样,不同的是[[]]支持正则匹配,不过要注意的是必须在内层中括号内左右两侧加空格
 
[root@egon ~]# [[ "$USER" ==  "root" ]];echo $?  # 注意内层[]中包含的内容必须左右两侧加空格
0
[root@egon ~]# [[ "$USER" ==  "root" ]];echo $?  # 一个等号也行两个等号也可以额
0
 
 
 
# 此外[[]]内部是可以使用正则的,注意:正则表达式不要加引号
[root@egon ~]# [[ "$USER" =~ "^root$" ]];echo $?  # 正则表达式不要加引号
1
[root@egon ~]# [[ "$USER" =~ ^root$ ]];echo $?  # 正则表达式不要加引号
0
[root@egon ~]# [[ ! "$USER" =~ t$ ]] && echo 此时不是管理员登录 || echo 是管理员登录
是管理员登录
 
 
 
[root@egon ~]# num1=123
[root@egon ~]# [[ "$num1" =~ ^[0-9]+$ ]];echo $?  # 判断是否是数字
0
[root@egon ~]# [[ "$num1" =~ ^[0-9]+$ ]] && echo "是数字"
是数字
 
 
 
[root@egon ~]# num2=abc123de
[root@egon ~]# [[ "$num2" =~ ^[0-9]+$ ]];echo $?
1
[root@egon ~]# [[ "$num2" =~ ^[0-9]+$ ]] || echo "num2不是数字"
num2不是数字
 
 
企业面试题1: 传入两个数值信息, 自动让脚本显示数值比较情况
 
[root@egon shell]# cat num.sh 
#!/bin/bash
 
[ $# -ne 2 ] && echo "只能传入两个整数" && exit
[[ ! $1 =~ ^[0-9]+$ ]] && echo "参数1必须是整数" && exit
[[ ! $2 =~ ^[0-9]+$ ]] && echo "参数2必须是整数" && exit
 
[[ $1 -lt $2 ]] && echo "$1 < $2"
[[ $1 -gt $2 ]] && echo "$1 > $2"
[[ $1 -eq $2 ]] && echo "$1 = $2"
[root@egon shell]# chmod +x num.sh 
[root@egon shell]# ./num.sh 17 37
17 < 37
5.2 补充浮点数的比较
# 需要注意的是:bc的结果为1代表真,为0代表假
[root@egon ~]# echo "10.3 >= 10.1" | bc
1
[root@egon ~]# echo "10.3 != 10.1" | bc
1
[root@egon ~]# echo "10.3 != 10.3" | bc
0
 
# 应用
[root@egon ~]# x=10.3
[root@egon ~]# y=10.1
[root@egon ~]# [ `echo "$x >= $y" | bc` -eq 1 ] && echo "$x 大于 $y"
10.3 大于 10.1
六 总结
条件测试:
 
格式1: test 条件表达式
格式2: [ 条件表达式 ]
格式3: (()) 数值比较,运算  C语言
 
格式4: [[ 条件表达式 ]],支持正则  =~
结合$符号
 
$[]    # 整数运算
$(())  # 整数运算
 
$()    # 命令替换
其他
 
()     # 子shell中执行
 
(责任编辑:中博IT教育)

苏公网安备 32030302000649号