if 判断语句与shell运算
Posted 锦衣admin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了if 判断语句与shell运算相关的知识,希望对你有一定的参考价值。
if 判断语句与shell运算
if 与 shell 运算
if 条件是浮点型比较运算
处理浮点型数字前需要将其转换成整数类型,再进行比较
方法:
-
需要比较的浮点数同时放大N倍
-
处理成整形
-
再进行比较
if 实现浮点型比较运算:
#l 编写脚本:
[root@server ~]# vim float.sh
#!/bin/bash
# 对外部传参用法做出提示,表示对外传参的两个参数做比较
if [ $# -ne 2 ]
then
echo 'Usege:'$0' args1 args2'
exit 8
fi
# 对外部传参的浮点数转换成整数并取整
num1=`echo "scale=2;$1*100"|bc|cut -d "." -f1`
num2=`echo "scale=2;$2*100"|bc|cut -d "." -f1`
# 通过if语句比较
if [ $num1 -gt $num2 ]
then
echo "$1 > $2"
elif [ $num1 -lt $num2 ]
then
echo "$1 < $2"
else
echo "$1 = $2"
fi
#l 运行脚本:
[root@server ~]# sh float.sh 3.33 4.55
3.33 < 4.55
[root@server ~]# sh float.sh 3.33 4.55 12
Usege:float.sh args1 args2
[root@server ~]# sh float.sh 3.33
Usege:float.sh args1 args2
if 条件是文件类型
判断文件类型时
if 判断文件表达式
命令格式:
if [ 选项 文件路径 ]
then
return
fi
选项说明:
文件类型:
-b f:文件是块设备文件时,返回真
-c f:文件是字符设备文件时,返回真
-h f:文件是符号链接文件时,返回真 (或 -L f 软连接返回真)
-S f:文件是socket 时,返回真
-p f:文件是一个命名管道时,返回真
-f f:为普通文件时,返回真
-d p:p是一个目录时,返回真
-e fp:文件或目录存在时,返回真
文件权限:
-r fp:文件或目录可读时,返回真
-w fp:文件或目录可写时,返回真
-x fp:文件或目录可执行时,返回真
文件当新旧:
f1 -nt f2:文件1 比文件2 新时(由修改日期决定),返回真
f1 -ot f2:文件1 比文件2 旧时(由修改日期绝对),返回真
f1 -ef f2:两个文件是否为同一个文件(硬连接),主要判断两个文件是否指向同一个inode号
非:
!:代表非,作用于选项前,有空格
-s f:文件大小大于0时(非空),返回真
演示:
#l 编写脚本
[root@server ~]# mkdir /root/demo
[root@server ~]# touch /root/demo/demo.txt
[root@server ~]# ln -s demo.sh mode.sh
[root@server ~]# vim test1.sh
#!/bin/bash
# 判断是否为软连接文件,是返回T
if [ -L /root/mode.sh ]
then
echo "Ture"
fi
# 判断是否为普通文件,是返回T
if [ -f /root/demo/demo.txt ]
then
echo "Ture"
fi
# 判断是否为目录,是返回T
if [ -d /root/demo ]
then
echo "Ture"
# 判断文件内容是否非空,加了!取反,是不返回T,由于取反就返回,所以返回T
if [ ! -s /root/demo/demo.txt ]
then
echo "Ture"
fi
#l 运行脚本:
[root@server ~]# sh test1.sh
Ture
Ture
Ture
Ture
if 条件是字符串比较运算
判断输入的字符串是否和给定的字符串相等时,用于验证
if 条件是字符串比较运算说明:
命令格式:
if [
–n 字符串 => 字符串的长度不为空时,返回真
–z 字符串 => 字符串的长度为空时,返回真
字符串1=字符串2 => 字符串是否相等,是返回真
字符串1!=字符串2 => 字符串是否不等,不等返回真
#l 编写脚本:
# vim string.sh
[root@server ~]# vim string.sh
#!/bin/bash
# 指定用户账号密码
init_account=root
init_pw=123456
# 交互式输入登录账号密码
read -p "$HOSTNAME login:" account
read -t5 -p "passwd:" pw
# 判断用户输入账号为空时提示错误
if [ -n "$account" ]
then
# 判断用户账号输错时提示错误
if [ "$account" == "$init_account" ]
then
# 判断用户密码输入为空时提示错误
if [ -n "$pw" ]
then
# 判断用户密码输错时提示错误,只有输入正确的密码才能登录
if [ "$pw" == "$init_pw" ]
then
echo "欢迎回来:$account"
else
echo "您输入的密码有误,请重新输入"
sleep 5
sh $0
fi
else
echo "你输入的密码为空,请重新输入"
sleep 5
sh $0
fi
else
echo "您输入的用户名不可用,请重新输入"
sleep 5
sh $0
fi
else
echo "您输入的用户名为空,请重新输入"
sleep 5
sh $0
fi
运行脚本:
# sh string.sh
[root@server ~]# sh string.sh
server login:
passwd:
您输入的用户名为空,请重新输入
server login:12
passwd:12
您输入的用户名不可用,请重新输入
server login:root
passwd:
你输入的密码为空,请重新输入
server login:root
passwd:112
您输入的密码不可用,请重新输入
server login:root => 输入正确账号密码退出脚本
passwd:123456
欢迎回来:root
if 条件是逻辑运算
if 语句可以执行逻辑运算,适用于多重条件判断时使用
逻辑运算符:与(&&)
、或(||)
、非(!)
-
逻辑与:必须全部条件满足,表达式才判断为真
-
逻辑或:至少有一个条件满足,表达式才判断为真
-
逻辑非:条件为真时,表达式判断为假;条件为假时,表达式判断为真
if 条件是逻辑运算说明:
命令格式:
# if [ condition1 选项 condition2 ]
或
# if [ condition1 ] 选项 [ cindition2 ]
选项说明:
-a 和 && :表示逻辑与
-o 和 || :表示逻辑或
! :表示逻辑非,一般以"!="方式应用
演示:
# if [ 1 -eq 1 -a 1 -ne 0 ] => 整个表示式为真
# if [ 1 -eq 1] && [ 1 -ne 0] => 整个表示式为真
# if [ 1 -eq 1 -a 1 -eq 0 ] => 整个表示式为真
# if [ 1 -eq 1] || [ 1 -eq 0] => 整个表示式为真
编写脚本:
# vim logic.sh
[root@server ~]# vim logic.sh
#!/bin/bash
# 判断自己是否为躺平一族
echo "只针对20~40进行判断,几岁写几岁,有无写1或0"
read -p "你几岁:" get_age
# 不允许谎报年龄者进行测试
if [ $get_age -lt 20 ] || [ $get_age -gt 40 ]
then
echo "滚,$get_age 岁的你不能进行趟一族测试"
exit 1
fi
read -p "有女朋友没:" get_girlfriend
read -p "有正经工作不:" get_jobs
read -p "有房子不:" get_house
read -p "有车子不:" get_car
# 对20-30岁小朋友进行趟一族测试,判定条件全部都不满足才能说自己是趟一族
if [ $get_age -ge 20 -a $get_age -lt 30 ]
then
if [ $get_girlfriend -eq 0 ] && [ $get_jobs -eq 0 ] && [ $get_house -eq 0 ] && [ $get_car -eq 0 ]
then
echo "test 20-30"
echo "恭喜您,$get_age 岁年纪轻轻就是趟一族普通帮众"
exit 1
else
echo "test 20-30"
echo "滚,$get_age 岁的你不是趟一族"
exit 1
fi
# 对30-40岁小朋友进行趟一族测试,判定条件满足一个才能说自己是趟一族
elif [ $get_age -gt 30 ] && [ $get_age -le 40 ]
then
if [ $get_girlfriend -eq 1 ] || [ $get_jobs -eq 1 ] || [ $get_house -eq 1 ] || [ $get_car -eq 1 ]
then
# echo "test 30-40"
echo "恭喜您,$get_age 岁就成为趟一族的精英成员"
exit 1
else
# echo "test 30-40"
echo "滚,$get_age 岁的你不是趟一族"
exit 1
fi
fi
演示:
# sh logic.sh
[root@server ~]# sh logic.sh
只针对20~40进行判断,几岁写几岁,有无写1或0
你几岁:33
有女朋友没:1
有正经工作不:0
有房子不:0
有车子不:0
恭喜您,33 岁就成为趟一族的精英成员
[root@server ~]# sh logic.sh
只针对20~40进行判断,几岁写几岁,有无写1或0
你几岁:33
有女朋友没:0
有正经工作不:0
有房子不:0
有车子不:0
滚,33 岁的你不是趟一族
[root@server ~]# sh logic.sh
只针对20~40进行判断,几岁写几岁,有无写1或0
你几岁:22
有女朋友没:1
有正经工作不:0
有房子不:0
有车子不:0
test 20-30
滚,22 岁的你不是趟一族
if 高级用法
if 使用双小圆括号:if (( 四则运算条件 ))
使用双小圆括号,可以在if条件中使用四则运算(只能做整型运算)
双小圆内变量可不带$、空格可随意有无
运算符的使用为: >
、<
、=
、==
、>=
、<=
、!=
if 使用双小圆括号植入数学表达式说明:
命令格式:
# if (( 四则运算表达式选项 ))
选项说明:
# if (( (5+5-5)*5/5 > 10 ))
编写脚本:
# vim calculator.sh
[root@server ~]# cat calculator.sh
#!/bin/bash
# if (()) 植入数学表达式
if (( (2-2+2)*6/2+(2**2) > 25 ))
then
echo "yes"
else
echo "no"
fi
运行代码:
# sh calculator.sh
[root@server ~]# sh calculator.sh
no
if 使用双方括号:if [[ 字符串条件 ]]
使用双方括号,条件对象是字符串(可以使用通配符)
使用通配符时,不需要加引号,否则代表字符串
为字符串提供正则
if 使用双方括号说明:
命令格式:
# if [[ 选项 ]]
选项说明:
# if [[ "$i" == a* ]] => 注意不要加引号,加引号*表示字符串了,不再为通配符
编写脚本:
# vim string.sh
[root@server ~]# vim string.sh
#!/bin/bash
# 定义字符串
for i in aaa aab abc ccd
do
if [[ "$i" == a* ]]
then
echo "$i"
fi
done
运行脚本:
# sh string.sh
[root@server ~]# sh string.sh
aaa
aab
abc
if 语句简写
- 当代码块
command
为单行代码时可以简写
单if 语句简写格式:
- 在脚本中可以简写:
单if语句简写:
[ condition ] && command
=> && 替代 then
if..else语句简写:
[ condition ] && command||command
=> || 替代 else
编写脚本:
简写第一种:
# vim if_simple.sh
[root@server ~]# vim if_simple.sh
#!/bin/base
# 单if语句简写,&& 替代 then
# 判断文件是否存在,不存在返回no
[ ! -e /bin/albb ] && echo "no"
# if..else语句简写,&& 替代then、|| 替代 else
# 判断文件是否存在,存在返回yes,不存在返回no
[ -e /etc/passwd ] && echo "yes" || echo "no"
运行脚本:
# sh if_simple.sh
[root@server ~]# sh if_simple.sh
no
yes
以上是关于if 判断语句与shell运算的主要内容,如果未能解决你的问题,请参考以下文章
Linux | shell脚本-条件判断if和循环语句for