shell编程之shell 运算
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之shell 运算相关的知识,希望对你有一定的参考价值。
shell编程之shell 运算
shell 四则运算
赋值运算:=
赋值运算符:
= :赋值运算符
演示:
a=10
name='pdd'
备注:字符串必须用引号引起来
算术运算(四则运算):
expr
命令:不能开方,必需有空格。let
命令:变量之间的加减乘除用let
命令,不能有空格$(())
命令:空格随意,不加反引号bc
命令:只有bc命令能做浮点运算
expr
命令在脚本中用法:
#!/bin/bash
# 必须有空格
# 变量必须加$符号
num1=10
num2=3
# 第一种:变量赋值输出
a=`expr $num2 - $num1`
echo $a
# 第二种:直接命令输出
echo "`expr $num1 - $num2`"
let
命令在脚本中用法:
#!/bin/bash
# 需要变量赋值然后输出变量
# 变量的$符可不加,运算中不可有空格
num1=10
num2=3
let a=num1+num2
echo $a
$(())
命令在脚本中用法:
#!/bin/bash
# 运算时变量$符号可不加
# 括号内空格可随意,有没有空格都行
# 注意:没有反引号
num1=10
num2=3
# 第一种:赋值输出
a=$((num2-num1))
echo $a
# 第二种:直接输出
echo "$((num1- num2))"
bc
命令在脚本中用法:
#!/bin/bash
# 需要加上$符号
# 运算时空格随意
# 只能变量赋值输出
num1=1.23
num2=2.34
a=`echo "scale=2;$num2- $num1"|bc`
echo $a
以上四个命令在终端中运算:
算术运算符:
+、-、*、/ :四则运算符,加减乘除
扩展:
% :取余
** :开方
运算命令:expr、let、$(())、bc命令。前三个只能做整数运算;bc命令能做浮点运算
演示:
# expr命令:只能做整数运算,格式比较古板,注意空格隔开
[root@server ~]# expr 5 \\* 3 => 注意*需要转义,否则会人为是通配符
15
[root@server ~]# expr 1 / 3
0
[root@server ~]# expr 5 / 3
1
[root@server ~]# expr 5 / 2 => 注意:只取商的整数值,余数不取,若商小于1则返回0
2
[root@server ~]# expr 7 % 2 => 取余数
1
# let命令:只能做整数运算,必须先赋值变量,再打印变量,运算符不需要在转义符\\
[root@server ~]# let a=2*3;echo $a
6
[root@server ~]# let a=5/2;echo $a
2
[root@server ~]# let a=5%2;echo $a
1
[root@server ~]# let a=5**2;echo $a
25
[root@server ~]# a=6
[root@server ~]# let a++;echo $a > a++ 代表 a=a+1
7
[root@server ~]# a=6
[root@server ~]# let a--;echo $a => a-- 代表 a=a-1
5
[root@server ~]# a=6
[root@server ~]# let a-=3;echo $a => a-=3 代表 a=a-3
3
[root@server ~]# a=6
[root@server ~]# let a+=3;echo $a => a+=3 代表 a=a+3
9
#l $(()),可以在括号内做算数运算
[root@server ~]# echo $((10*3))
30
[root@server ~]# echo $((10/3))
3
[root@server ~]# echo $((10%3))
1
[root@server ~]# echo $((10**3))
1000
# bc命令(交互式),如果没有请安装:yum install -y bc
说明:直接在终端输入"bc"命令。需要指定"scale=N"告诉bc取N个小数点
[root@server ~]# 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'.
10*3 => 输入完毕后直接回车
30
10/3
3
10%3
1
scale=3 => 需要通过"scale"指定取小数点后几位
10/3
3.333
[root@server ~]# echo "scale=2;100/3" |bc => 不通过交互式做浮点运算
33.33
shell 逻辑运算
逻辑运算介绍:
完成一个任务需要多个条件才能满足,或者是多个条件只要满足一个即可,这就是逻辑运算。通过多个条件判断结果,才能得出结论
逻辑运算应用场景:多条件同时判断
逻辑运算符:
-
逻辑与:&&
-
逻辑或:||
-
逻辑非:!
逻辑运算符说明:
逻辑运算注意事项:
"逻辑与"、"逻辑或"运算都需要两个或以上条件
"逻辑非"运算只能一个条件(非真即假条件)
逻辑与运算:一假永假;全真为真
逻辑或运算:一真永真;真假永真
逻辑非运算:非真为假;非假为真
"逻辑与"、"逻辑或"的短路运算:
#l 逻辑与中靠前的条件中出现了假,后面的条件就不在判断了,因为已经判断为假就会结束运算
=> 即必须满足全部条件才为真,只要判断出一个条件为假就判断不满足条件
#l 逻辑或中靠前的条件中出现了真,后面的条件就不在判断了,因为已经判断为真就会结束运算
=> 即只要判断全部条件中的其中一个为真就判断满足条件
#l 备注:判断条件是从前往后判断的
整数比较运算
-
通过test命令比较整数大小
-
浮点数比较运算可以先将其转换成整数再进行比较
-
通过变量赋值,调用变量不需要用双引号引起来。如 :
if [ $a -gt $b ]
就可以了
test命令比较整数运算:
命令格式:
# test num1 选项 num2
选项说明:
精确比较:
-eq:等于
-gt:大于
-lt:小于
模糊比较:
-ge:大于或等于
-le:小于或等予以
-ne:不等于
判断整数:
test 整数1 -eq 整数2 => 整数相等
test 整数1 -ge 整数2 => 整数1大于等于整数2
test 整数1 -gt 整数2 => 整数1大于整数2
test 整数1 -le 整数2 => 整数1小于等于整数2
test 整数1 -lt 整数2 => 整数1小于整数2
test 整数1 -ne 整数2 => 整数1不等于整数2
演示:
#l 返回0表示上一条命令执行正常,非0为执行异常
[root@server ~]# test 1 -eq 1; echo $?
0
[root@server ~]# test 3 -eq 3;echo $?
0
[root@server ~]# test 5 -gt 3;echo $?
0
[root@server ~]# test 5 -lt 3;echo $?
1
浮点比较运算
处理浮点型数字前需要将其转换成整数类型,再进行比较
方法:
-
需要比较的浮点数同时放大N倍
-
处理成整形
-
再进行比较
通过脚本比较运算:
在脚本中浮点数处理成整形:
num=`echo "scale=2;float_num*100"|bc|cut -d "." -f1`
#l 备注:浮点数是几位就将其乘上多少位的倍数,然后取整数值进行比较
字符串比较运算
=:一个等号时赋值
==:两个等于号是比较等号两边大小
test命令比较字符串运算:
命令格式:
# test 选项 字符串
选项说明:
-n:test –n 字符串 => 字符串的长度不为空时,返回真
-z:test –z 字符串 => 字符串的长度为空时,返回真
= :test 字符串1 = 字符串2 => 字符串是否相等,是返回真
!=:test 字符串1! = 字符串2 => 字符串是否不等,不等返回真
字符串比较在脚本中用法:
#!/bin/bash
# 只有打印正确账号密码才能输出hello word
# 账号:root 密码:123456
read -p "login:" user
read -p "passwd:" pw
# 比较字符串是否为空
if [ -z "$user" ];then
echo "输入账号为空"
elif [ "$user" == "root" ];then
if [ -z "$pw" ];then
echo "输入的密码为空"
elif [ "$pw" == "123456" ];then
echo "欢迎登录:$user"
else
echo "你输入的密码错误"
fi
else
echo "你输入的账号错误"
fi
文件比较运算
tes命令比较文件:
命令格式:
# test 选项 选项的值
选项说明:
判断文件:
-b f:文件是块设备文件时,返回真
-c f:文件是字符设备文件时,返回真
-h f:文件是符号链接文件时,返回真 (或 -L f)
-S f:文件是socket时,返回真
-p f:文件是一个命名管道时,返回真
"-f f:f是普通文件时,返回真"
-d p:p是一个目录时,返回真
"-e fp:文件或目录存在时,返回真"
-u fp:文件或目录设置了SUID 位时,返回真
-O fp:文件或目录属于有效用户ID时,返回真(字母O 大写)
-g fp:文件或目录设置了组id时,返回真
-G p:文件或目录属于有效组ID时,返回真
-k fp:文件或目录设置了"粘滞"位时,返回真
-s f:文件大小大于0时(非空,有内容),返回真
-t fd:文件描述符是在一个终端打开时(fd 默认为 1),返回真
-r fp:文件或目录可读时,返回真
-w fp:文件或目录可写时,返回真
-x fp:文件或目录可执行时,返回真
f1 -nt f2:文件1 比文件2 新时(由修改日期决定),返回真
f1 -ot f2:文件1 比文件2旧时(由修改日期绝对),返回真
f1 -ef f2:两个文件是否为同一个文件(硬连接),主要判断两个文件是否指向同一个inode号
以上是关于shell编程之shell 运算的主要内容,如果未能解决你的问题,请参考以下文章
linux之Shell编程--Shell基本运算符之算数运算符和关系运算符实例演示