shell中的数值运算

19 篇文章 0 订阅

1.Shell中的数值运算
问题
本案例要求熟悉Linux Shell环境的特点,主要练习以下操作:
使用expr、KaTeX parse error: Unexpected character: '' at position 110: …复上述计算,最多显示4位小数 ̲步骤 实现此案例需要按照如下步…符号。
首先定义变量X=1234,然后分别计算与78的加减乘除和求模运算结果:
[root@svr5 ~]# X=1234 //定义变量X
[root@svr5 ~]# expr $X + 78 //加法
1312
[root@svr5 ~]# expr $X - 78 //减法
1156
[root@svr5 ~]# expr $X * 78 //乘法,操作符应添加\转义
96252
[root@svr5 ~]# expr $X / 78 //除法,仅保留整除结果
15
[root@svr5 ~]# expr X 642 ) 使 用 X % 78 //求模 64 2)使用 X642使[]或$(())表达式
乘法操作无需转义,运算符两侧可以无空格;引用变量可省略 $ 符号;计算结果替换表达式本身,可结合echo命令输出。
同样对于变量X=1234,分别计算与78的加减乘除和求模运算结果:
[root@svr5 ~]# X=1234
[root@svr5 ~]# echo $[X+78]
1312
[root@svr5 ~]# echo $[X-78]
1156
[root@svr5 ~]# echo $[X
78]
96252
[root@svr5 ~]# echo $[X/78]
15
[root@svr5 ~]# echo [ X 643 ) 使 用 l e t 命 令 e x p r 或 [X%78] 64 3)使用let命令 expr或 [X643使letexpr[]、$(())方式只进行运算,并不会改变变量的值;而let命令可以直接对变量值做运算再保存新的值。因此变量X=1234,在执行let运算后的值会变更;另外,let运算操作并不显示结果,但是可以结合echo命令来查看:
[root@svr5 ~]# X=1234
[root@svr5 ~]# let X+=78 ; echo $X
1312
[root@svr5 ~]# let X-=78 ; echo $X
1234
[root@svr5 ~]# let X*=78 ; echo $X
96252
[root@svr5 ~]# let X/=78 ; echo $X
1234
[root@svr5 ~]# let X%=78 ; echo $X
64
步骤二:小数运算工具
1)bc交互式运算
先执行bc命令进入交互环境,然后再输入需要计算的表达式。以计算小数12.34与5.678的四则运算为例,相关操作如下:
[root@svr5 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty’.
12.34+56.78 //加法
69.12
12.34-56.78 //减法
-44.44
12.3456.78 //乘法
700.66
12.34/56.78 //除法
0
quit //退出交互计算器
[root@svr5 ~]#
2)bc非交互式运算
将需要运算的表达式通过管道操作交给bc运算。注意,小数位的长度可采用scale=N限制,除此以外也受参与运算的数值的小数位影响。以计算小数12.34与5.678的四则运算为例,相关操作如下:
[root@svr5 ~]# echo ‘scale=4;12.34+5.678’ | bc
18.018
[root@svr5 ~]# echo ‘scale=4;12.34-5.678’ | bc
6.662
[root@svr5 ~]# echo 'scale=4;12.34
5.678’ | bc
70.0665
[root@svr5 ~]# echo ‘scale=4;12.34/5.678’ | bc
2.1733
2.条件测试操作
问题
本案例要求参考PPT上的示例,分别练习以下条件测试操作:
识别文件/目录的状态
比较整数值的大小
字符串匹配
多个条件/操作的逻辑组合
步骤
实现此案例需要按照如下步骤进行。
步骤一:条件测试的基本用法
1)一般用法
使用“test 表达式”或者[ 表达式 ]都可以,表达式两边至少要留一个空格。比如,判断变量X的值是否大于5,操作如下:
[root@svr5 ~]# X=10
[root@svr5 ~]# test $X -gt 5
上述test测试也可改用 [ ]方式(推荐用这种方式):
[root@svr5 ~]# [ $X -gt 5 ]
[root@svr5 ~]#
条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即 ? ) , 所 以 可 以 在 测 试 后 查 看 变 量 ?),所以可以在测试后查看变量 ??的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作) 。
比如,分别测试变量X的值(10)是否大于5、是否大于20:
[root@svr5 ~]# [ $X -gt 5 ]
[root@svr5 ~]# echo $?
0 //返回值为0,说明测试的条件成立
[root@svr5 ~]# [ $X -gt 20 ]
[root@svr5 ~]# echo $?
1 //返回值不为0,说明测试的条件不成立
或者,结合逻辑分隔更直接的给出结果:
[root@svr5 ~]# [ $X -gt 5 ] && echo “YES” || echo “NO”
YES //因为10>5,所以 YES
[root@svr5 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 12: X -gt 20 ] &̲& echo "YES" ||…?。比如,若要检查一个软件包是否安装,正常可以执行“rpm -q 软件名”查询,人工可以直接看显示结果,脚本却没有那么智能,怎么办呢,就看返回值 ? 。 比 如 , 分 别 查 询 一 个 已 安 装 的 包 、 未 安 装 的 包 , ?。 比如,分别查询一个已安装的包、未安装的包, ?? 返回值是不同的:
[root@svr5 ~]# rpm -q httpd
httpd-2.2.3-74.el5
[root@svr5 ~]# echo $?
0
[root@svr5 ~]# rpm -q nginx
package nginx is not installed
[root@svr5 ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 38: …: [root@svr5 ~]#̲ rpm -q httpd &… [ -r “/tmp/rtest.txt” ] && echo “可读” || echo “不可读”
不可读
普通用户只对自己拥有r权限的文件或目录,-r测试时结果才成立:
[zengye@svr5 ~]$ ls -l .bashrc
-rw-r–r-- 1 zengye zengye 124 09-24 16:44 .bashrc
[zengye@svr5 ~]$ [ -r “.bashrc” ] && echo “可读” || echo “不可读”
可读
5)-w 判断对象是否可写
此测试同样对root用户无效,无论文件是否设置w权限,root都可写:
[root@svr5 ~]# chmod -w /tmp/rtest.txt //去掉所有的w权限
[root@svr5 ~]# ls -l /tmp/rtest.txt //确认设置结果
---------- 1 root root 33139 12-11 10:43 /tmp/rtest.txt
[root@svr5 ~]# [ -w “/tmp/rtest.txt” ] && echo “可写” || echo “不可写”
可写
切换为普通用户,可以正常使用-w测试:
[zengye@svr5 ~]$ ls -l /tmp/rtest.txt
---------- 1 root root 33139 12-11 10:52 /tmp/rtest.txt
[zengye@svr5 ~]$ [ -w “/tmp/rtest.txt” ] && echo “可写” || echo “不可写”
不可写
[zengye@svr5 ~]$ ls -l .bashrc
-rw-r–r-- 1 zengye zengye 124 09-24 16:44 .bashrc
[zengye@svr5 ~]$ [ -w “.bashrc” ] && echo “可写” || echo “不可写”
可写
6)-x 判断对象是否具有可执行权限
这个取决于文件本身、文件系统级的控制,root或普通用户都适用:
[root@svr5 ~]# chmod 644 /tmp/rtest.txt //重设权限,无x
[root@svr5 ~]# ls -l /tmp/rtest.txt //确认设置结果
-rw-r–r-- 1 root root 33139 12-11 10:52 /tmp/rtest.txt
[root@svr5 ~]# [ -x “/tmp/rtest.txt” ] && echo “可执行” || echo “不可执行”
不可执行
[root@svr5 ~]# chmod +x /tmp/rtest.txt //添加x权限
[root@svr5 ~]# [ -x “/tmp/rtest.txt” ] && echo “可执行” || echo “不可执行”
可执行
步骤三:整数值比较
参与比较的必须是整数(可以调用变量),比较非整数值时会出错:
[root@svr5 ~]# A=20.4
[root@svr5 ~]# [ $A -gt 10 ] //不支持小数比较
-bash: [: 20.4: integer expression expected
1)-eq 比较两个数是否相等。
[root@svr5 ~]# X=20 //定义一个测试变量
[root@svr5 ~]# [ $X -eq 20 ] && echo “相等” || echo “不相等”
相等
[root@svr5 ~]# [ $X -eq 30 ] && echo “相等” || echo “不相等”
不相等
2)-ne 比较两个数是否不相等。
[root@svr5 ~]# [ $X -ne 20 ] && echo “不等于” || echo “等于”
等于
[root@svr5 ~]# [ $X -ne 30 ] && echo “不等于” || echo “等于”
不等于
3)-gt 比较前面的整数是否大于后面的整数。
[root@svr5 ~]# [ $X -gt 10 ] && echo “大于” || echo “否”
大于
[root@svr5 ~]# [ $X -gt 20 ] && echo “大于” || echo “否”

[root@svr5 ~]# [ $X -gt 30 ] && echo “大于” || echo “否”

4)-ge 比较前面的整数是否大于或等于后面的整数。
[root@svr5 ~]# [ $X -ge 10 ] && echo “大于或等于” || echo “否”
大于或等于
[root@svr5 ~]# [ $X -ge 20 ] && echo “大于或等于” || echo “否”
大于或等于
[root@svr5 ~]# [ $X -ge 30 ] && echo “大于或等于” || echo “否”

5)-lt 比较前面的整数是否小于后面的整数。
[root@svr5 ~]# [ $X -lt 10 ] && echo “小于” || echo “否”

[root@svr5 ~]# [ $X -lt 20 ] && echo “小于” || echo “否”

[root@svr5 ~]# [ $X -lt 30 ] && echo “小于” || echo “否”
小于
6)-le 比较前面的整数是否小于或等于后面的整数。
[root@svr5 ~]# [ $X -le 10 ] && echo “小于或等于” || echo “否”

[root@svr5 ~]# [ $X -le 20 ] && echo “小于或等于” || echo “否”
小于或等于
[root@svr5 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 12: X -le 30 ] &̲& echo "小于或等于" …(who | wc -l) //赋值给变量N
[root@svr5 ~]# [ $N -gt 5 ] && “超过了” || echo “没超过”
没超过
上述赋值给变量N及与5比较的操作,可以简化为如下形式:
[root@svr5 ~]# [ $(who | wc -l) -gt 5 ] && “超过了” || echo “没超过”
没超过
步骤四:字符串匹配
1)== 比较两个字符串是否相同
检查当前用户是否为root。
当root用户执行时:
[root@svr5 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 18: …ER == "root" ] &̲& echo "YES" ||… [ KaTeX parse error: Expected 'EOF', got '&' at position 18: …ER == "root" ] &̲& echo "YES" ||… [ $USER != “root” ] && echo “禁止访问” || echo “欢迎”
禁止访问
当root用户执行时:
[root@svr5 ~]# [ KaTeX parse error: Expected 'EOF', got '&' at position 18: …ER != "root" ] &̲& echo "禁止访问" |…var1" ] && echo “空值” || echo “非空值”
非空值
[root@svr5 ~]# [ -z KaTeX parse error: Expected 'EOF', got '&' at position 8: var2 ] &̲& echo "空值" || …var2" ] && echo “空” || echo “非空”
非空 //空格视为有效字符,所以非空
[root@svr5 ~]# [ -z KaTeX parse error: Expected 'EOF', got '&' at position 8: var3 ] &̲& echo "空值" || …var2" ] && echo “不为空” || echo “为空”
不为空
[root@svr5 ~]# [ -n “$var3” ] && echo “不为空” || echo “为空”
为空
步骤五:多个条件/操作的逻辑组合
1)&&,逻辑与
给定条件必须都成立,整个测试结果才为真。
检查变量X的值是否大于10,且小于30:
[root@svr5 ~]# X=20 //设置X变量的值为20
[root@svr5 ~]# [ $X -gt 10 ] && [ $X -lt 30 ] && echo “YES”
YES
多个条件组合时,可以使用 [[ … ]] 界定,比如上述测试可以改为如下:
[root@svr5 ~]# [[ $X -gt 10 && $X -lt 30 ]] && echo “YES”
YES
2)||,逻辑或
只要其中一个条件成立,则整个测试结果为真。
检查变量X的值是否小于10或者小于30:
[root@svr5 ~]# [[ $X -lt 10 || $X -lt 30 ]] && echo “YES”
YES
只要/tmp/、/var/spool/目录中有一个可写,则条件成立:
[root@svr5 ~]# [ -w “/tmp/” ] || [ -w “/var/spool/” ] && echo “OK”
OK

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值