当前位置:网站首页>Shell(2)数值运算与判断
Shell(2)数值运算与判断
2022-08-04 05:26:00 【AHui_CSDN】
一. Shell传参方式
第一种传参方式:直接传参
$1 脚本的第一个参数 $2 脚本的第二个参数
[[email protected] day2]# cat env.sh
#!/bin/sh
echo $1 $2
[[email protected] day2]# sh env.sh ahui 18
ahui 18
[[email protected] day2]# cat env.sh
#!/bin/sh
echo name: $1
echo age: $2
[[email protected] day2]# sh env.sh ahui 123
name: ahui
age: 123
[[email protected] day2]# cat env.sh
#!/bin/sh
echo name=$1
echo age=$2
[[email protected] day2]# sh env.sh ahui 123
name=ahui
age=123
第二种传参方式: 赋值传参
[[email protected] day2]# cat env.sh
#!/bin/sh
name=$1
age=$2
echo name=$name
echo age=$age
[[email protected] day2]# sh env.sh ahui 123
name=ahui
age=123
案例:
[[email protected] day2]# cat env.sh
#!/bin/sh
touc /tmp/test.txt
result=$?
name=$1
age=$2
echo name=$name
echo age=$age
[ $result -eq 0 ] && echo ok || echo error
[[email protected] day2]# sh env.sh ahui 123
env.sh: line 2: touc: command not found
name=ahui
age=123
error
第三种传参方式: read读入
[[email protected] day2]# cat env.sh
#!/bin/sh
read -p "Please Input two env: " name age
echo $name $age
[[email protected] day2]# sh env.sh
Please Input two env: ahui 123
ahui 123
[[email protected] day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
read -p "Please Input age env: " age
echo name: $name
echo age: $age
[[email protected] day2]#
[[email protected] day2]# sh env.sh
Please Input name env: ahui
Please Input age env: 123
name: ahui
age: 123
案例: 使用三种传参方式来修改IP地址和主机名称
1)修改IP地址
2)修改主机名称
[[email protected] day2]# cat name.sh
#!/bin/sh
#修改主机名称
name=$1
hostnamectl set-hostname $name
#修改IP地址
ip_dir=/etc/sysconfig/network-scripts/ifcfg-eth0
#1.获取当前的IP地址
ipadd=`grep ^IP $ip_dir|awk -F. '{print $NF}'`
#2.将获取的当前的IP地址替换成新的IP
read -p "请输入新的ip的最后一位: " ip
sed -i "s#$ipadd#$ip#g" $ip_dir
grep 'IPADDR' $ip_dir
二. 数值运算
加减乘除幂取余
expr 不支持小数运算
[[email protected] day2]# expr 1+1
1+1
[[email protected] day2]# expr ahui
ahui
[[email protected] day2]# expr 1 + 1
2
[[email protected] day2]# expr 10 - 1
9
[[email protected] day2]# expr 10 * 1
expr: syntax error
[[email protected] day2]# expr 10 \* 1
10
案例: 通过expr判断用户输入的是否为整数
[[email protected] day2]# expr 1 + 1 &>/dev/null
[[email protected] day2]# echo $?
0
[[email protected] day2]# expr 1 + 1.5 &>/dev/null
[[email protected] day2]# echo $?
2
案例: ahui 不能过99
[[email protected] day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
read -p "Please Input age env: " age
expr 1 + $age &>/dev/null
[ $? -ne 0 ] && echo 请输入正确的年龄 && exit
[ ${
#age} -gt 2 ] && echo 请输入小于100的年龄 && exit
[ `echo $age|wc -L` -gt 2 ] && echo 请输入小于100的年龄 && exit
[ $age -gt 99 ] && echo 请输入小于100的年龄 && exit
echo name: $name
echo age: $age
执行结果
[[email protected] day2]# sh env.sh
Please Input name env: ahui
Please Input age env: 1
name: ahui
age: 1
[[email protected] day2]# sh env.sh
Please Input name env: ahui
Please Input age env: 99
name: ahui
age: 99
$[]
==不支持小数运算 ==
[[email protected] day2]# echo $[1+1]
2
[[email protected] day2]# echo $[1*1]
1
[[email protected] day2]# echo $[1*10]
10
[[email protected] day2]# echo $[1-10]
-9
[[email protected] day2]# echo $[10-10]
0
[[email protected] day2]# echo $[10**10]
10000000000
[[email protected] day2]# echo $[10%10]
0
$(())
不支持小数 运算效率最高
[[email protected] day2]# echo $((10*10))
100
[[email protected] day2]# echo $((10**10))
10000000000
[[email protected] day2]# echo $((10/10))
1
[[email protected] day2]# echo $((10/10*10))
10
[[email protected] day2]# echo $((10/10*10-2))
8
[[email protected] day2]# echo $((10/10*10-2**4))
-6
[[email protected] day2]# echo $((10/10*(10-2)**4))
4096
let运算 & i++
不支持小数
以变量的方式做运算
[[email protected] day2]# let 1+1
[[email protected] day2]# let 1 + 1
-bash: let: +: syntax error: operand expected (error token is "+")
[[email protected] day2]# let a=10+10
[[email protected] day2]# echo $a
20
[[email protected] day2]# let a=10*10
[[email protected] day2]# echo $a
100
[[email protected] day2]# let a=10/10
[[email protected] day2]# echo $a
1
[[email protected] day2]# let i++
[[email protected] day2]# echo $i
1
[[email protected] day2]# #i++ ======== i=i+1
[[email protected] day2]# let i++
[[email protected] day2]# let i++
[[email protected] day2]# let i++
[[email protected] day2]# echo $i
4
[[email protected] day2]# unset i # 取消变量
[[email protected] day2]# let ++i
[[email protected] day2]# let ++i
[[email protected] day2]# let ++i
[[email protected] day2]# echo $i
3
i++和++i的区别
直接做运算结果相同
有变量赋值情况下结果不同
i++ 先赋值在运算
++i 先运算在赋值
[[email protected] ~]# a=1
[[email protected] ~]# b=1
[[email protected] ~]# let c=a++
[[email protected] ~]# let d=++b
[[email protected] ~]# #let c=a++ c=a+1
[[email protected] ~]# #let d=++b d=1+b
[[email protected] ~]# echo $c
1
[[email protected] ~]# echo $d
2
bc 支持小数和整数运算
[[email protected] ~]# yum -y install bc
[[email protected] ~]# echo 1+1|bc
2
[[email protected] ~]# echo 10+1.5|bc
11.5
[[email protected] ~]# echo 10*1.5|bc
15.0
[[email protected] ~]# echo 10/3|bc
3
awk python
[[email protected] ~]# awk 'BEGIN{print 10/3}'
3.33333
[[email protected] ~]# awk 'BEGIN{print 10**3}'
1000
[[email protected] ~]# awk 'BEGIN{print 10**3.2}'
1584.89
[[email protected] ~]# awk 'BEGIN{print 10-3.2}'
6.8
[[email protected] ~]# awk 'BEGIN{print 10-3.2*100/3}'
-96.6667
[[email protected] ~]# echo 100 200|awk '{print $1*$2}'
20000
[[email protected] ~]# echo 100 200|awk '{print $1/$2}'
0.5
[[email protected] ~]# echo 100 200|awk '{print $1**$2}'
inf
[[email protected] ~]# echo 100 2|awk '{print $1**$2}'
10000
案例: 写一个脚本传参的方式做一个计算器 加减乘除
[[email protected] ~]# cat count.sh
echo "请输入算式"
read -p ":" a
echo $a | grep "[+,*,/,-]{1}"
[ $? -ne 0 ] && echo "请输入正确的运算符号+、-、*、/" && exit
echo $a | sed "s#[+,*,/, ,=,-]##g" | xargs -i expr 1 + {
}
[ $? -ne 0 ] && echo "请输入两个整数" && exit
[[ $a =~ = ]] && echo "$a `echo $a |bc`"||echo "$a = `echo $a |bc`"
三. 比较表达式:整数比较
语法结构:
判断比较两个数字大小
test 20 比较符 10
[ 整数1 比较符 整数2 ]
[ `命令` 比较符 整数 ]
比较符
= -eq 等于
> -gt 大于
>= -ge 大于等于
< -lt 小于
<= -le 小于等于
!= -ne 不等于
比较判断: 使用test
[[email protected] ~]# test 20 -gt 10
[[email protected] ~]# echo $?
0
[[email protected] ~]# test 20 -gt 100
[[email protected] ~]# echo $?
1
案例
[[email protected] ~]# test 20 -gt 10 && echo 成立 || echo 不成立
成立
[[email protected] ~]# test 10 -gt 10 && echo 成立 || echo 不成立
不成立
[[email protected] ~]# test 10 -eq 10 && echo 成立 || echo 不成立
成立
比较判断: 使用[]
== 整数两端必须有空格==
[[email protected] ~]# [ 100 -gt 20 ]
[[email protected] ~]# [ 100 -gt 20]
-bash: [: missing `]'
[[email protected] ~]# [100 -gt 20 ]
-bash: [100: command not found
[[email protected] ~]# [ 100 -gt 20 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ 100 -gt 100 ] && echo 成立 || echo 不成立
不成立
[[email protected] ~]# [ 100 -ge 100 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ 1000 -ge 100 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ 1000 -ne 100 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ 1000 -le 100 ] && echo 成立 || echo 不成立
不成立
判断支持命令
[[email protected] ~]# grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# grep bash /etc/passwd|wc -l
1
[[email protected] ~]# [ `grep bash /etc/passwd|wc -l` -eq 1 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ `grep bash /etc/passwd|wc -l` -ne 0 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ `grep bash /etc/passwd|wc -l` -gt 0 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ `grep bash /etc/passwd|wc -l` -gt 1 ] && echo 成立 || echo 不成立
不成立
案例: 使用read传参 输入两个整数 是否为整数做判断 然后比对两个数字的大小
[[email protected] ~]# cat ><.sh
#!/bin/sh
echo "请输入两个数开始比较大小啦"
read -p ":" a b
[ `awk "BEGIN{print $a*100000}"` -eq `awk "BEGIN{print $b*100000}"` ] && echo "$a = $b"
[ `awk "BEGIN{print $a*100000}"` -gt `awk "BEGIN{print $b*100000}"` ] && echo "$a > $b"
[ `awk "BEGIN{print $a*100000}"` -lt `awk "BEGIN{print $b*100000}"` ] && echo "$a < $b"
多整数比较
并且: -a and
或者: -o or
语法结构:
[ 整数1 比较符 整数2 并且 整数3 比较符 整数4 ]
[ 整数1 比较符 整数2 或者 整数3 比较符 整数4 ]
[[email protected] ~]# [ 100 -gt 20 -a 20 -eq 30 ] && echo 成立 || echo 不成立
不成立
[[email protected] ~]# [ 100 -gt 20 -a 20 -le 30 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ 100 -gt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
成立
[[email protected] ~]# [ 100 -lt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
不成立
案例:
[[email protected] day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
read -p "Please Input age env: " age
expr 1 + $age &>/dev/null
[ $? -ne 0 ] && echo 请输入正确的年龄 && exit
if [ $age -gt 0 -a $age -lt 100 ];then
echo name: $name
echo age: $age
else
echo "不成立"
exit
fi
四.条件表达式: 文件判断
语法格式:
test -f /etc/hosts
[ 判断符 文件/目录/路径 ]
[ -f /etc/hosts ]
判断符号:
-f 文件存在则为真(文件为常规普通文件)
-d 目录存在则为真
-e 任意文件存在则为真
-r 文件可读为真
-w 文件可写为真
-x 文件可执行为真
! 取反
[[email protected] day2]# [ -f /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[[email protected] day2]# [ -e /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[[email protected] day2]# [ -f /etc/ ] && echo 文件存在 || echo 文件不存在
文件不存在
[[email protected] day2]# [ -d /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[[email protected] day2]# [ -e /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[[email protected] day2]# [ -r /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[[email protected] day2]# [ -r /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[[email protected] day2]# [ -x /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件不存在
[[email protected] day2]# [ -f /etc/hosts -a -d /etc ] && echo ok || echo error
ok
[[email protected] day2]# [ -d /etc/hosts -a -d /etc ] && echo ok || echo error
error
[[email protected] day2]# [ -d /etc/hosts -o -d /etc ] && echo ok || echo error
ok
案例: 判断文件存在则执行
判断bashrc存在则执行
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
调用函数库
[[email protected] ~]# cat test.sh
hehe(){
echo test
}
hehe
[[email protected] ~]# sh test.sh
test
[[email protected] ~]# hehe
-bash: hehe: command not found
[[email protected] ~]# hehe
-bash: hehe: command not found
[[email protected] ~]# source test.sh
test
[[email protected] ~]# hehe
test
[[email protected] day2]# cat test.sh
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
if [ -f $1 ];then
action "$1" /bin/true
else
action "$1" /bin/false
fi
[[email protected] day2]# sh test.sh /etc/hosts
/etc/hosts [ OK ]
[[email protected] day2]# sh test.sh /etc/hostssssss
/etc/hostssssss [FAILED]
[[email protected] day2]# sh test.sh /etc/
/etc/ [FAILED]
[[email protected] day2]# sh test.sh /etc/passwd
/etc/passwd [ OK ]
案例2: 判断目录是否存在 如果不存在则创建
[[email protected] day2]# [ -d hehe ] || mkdir hehe
[[email protected] day2]# ll
drwxr-xr-x 2 root root 6 Aug 2 11:20 hehe
五.条件表达式:字符串比对
-n 字符串不为0则为真
-z 字符串为0则为真
[[email protected] day2]# test=aaa
[[email protected] day2]# echo $test
aaa
[[email protected] day2]# [ -n $test ] && echo 成立
成立
[[email protected] day2]# test=""
[[email protected] day2]# [ -z $test ] && echo 成立
成立
语法格式:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[[email protected] day2]# [ root = root ] && echo 成立|| echo 不成立
成立
[[email protected] day2]# [ root = roo ] && echo 成立|| echo 不成立
不成立
[[email protected] day2]# [ root != roo ] && echo 成立|| echo 不成立
成立
[[email protected] day2]# [ $name != roo ] && echo 成立|| echo 不成立
成立
[[email protected] day2]# [ $name = roo ] && echo 成立|| echo 不成立
不成立
[[email protected] day2]# echo $name
hehe
[[email protected] day2]# [ $name = hehe ] && echo 成立|| echo 不成立
成立
[[email protected] day2]# [ $name = roo -o $name = hehe ] && echo 成立|| echo 不成立
成立
案例: 用户输入的字符串为0则退出
[[email protected] day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit
正则匹配:
[[email protected] day2]# [[ root =~ ^ro ]] && echo 成立|| echo 不成立
成立
[[email protected] day2]#
[[email protected] day2]# [[ root =~ t$ ]] && echo 成立|| echo 不成立
成立
[[email protected] day2]# [[ root =~ [a-z]$ ]] && echo 成立|| echo 不成立
成立
[[email protected] day2]# [[ root =~ [0-9]$ ]] && echo 成立|| echo 不成立
不成立
[[email protected] day2]# [[ root1 =~ [0-9]$ ]] && echo 成立|| echo 不成立
成立
只允许字母
[[email protected] day2]# [[ ahu100 =~ [a-z] ]] && echo 成立 || echo 不成立
成立
[[email protected] day2]# [[ ahu100 =~ [a-z]$ ]] && echo 成立 || echo 不成立
不成立
[[email protected] day2]# [[ ahu100 =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
不成立
[[email protected] day2]# [[ ahui =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
不成立
[[email protected] day2]# [[ a =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
成立
[[email protected] day2]# [[ a =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
成立
[[email protected] day2]# [[ ahui =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
成立
[[email protected] day2]# [[ ah45hui =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
不成立
案例: 要求传参的名称必须为字母 不允许有数字
[[email protected] day2]# cat env.sh
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit
if [[ $name =~ ^[a-Z]+$ ]];then
echo $name
else
echo "必须为字母"
exit
fi
read -p "Please Input age env: " age
if [[ $age =~ ^[0-9]{
2}$ ]];then
echo $age
else
echo "必须输入0-100之间的数字"
exit
fi
小结:
脚本传参方式
直接传参 $1 $2
赋值传参 name=$1
read传参 read -p “提示” name数值运算:
整数: expr $[] $(()) let bc
都支持: awk python数值比较
test
[ 整数1 比较符 整数2 ]= -eq 等于 > -gt 大于 >= -ge 大于等于 < -lt 小于 <= -le 小于等于 != -ne 不等于
多整数比较 -a -o
文件判断
[ 判断符 文件/目录 ]
-f 文件存在则为真(文件为常规普通文件)
-d 目录存在则为真
-e 任意文件存在则为真
-r 文件可读为真
-w 文件可写为真
-x 文件可执行为真
! 取反
案例 文件存在则执行
/etc/init.d/functions字符串比对
-n 值不为0为真
-z 值为0则为真[ root = root ] [ root != root ]
正则匹配
[[ root =~ ^r ]] [[ root =~ ^[0-9] ]] [[ $name =~ ^[a-Z0-9]+$ ]]
判断是否为整数
判断传参的个数
判断传参参数的长度
expr[[ $age = ^[0-9]+$ ]]
判断是否为空
[ -z $name ]
边栏推荐
猜你喜欢
实际开发中,如何实现复选框的全选和不选
擎朗智能全国研发创新中心落地光谷:去年曾获2亿美元融资
嵌入式系统驱动初级【4】——字符设备驱动基础下_并发控制
8.03 Day34---BaseMapper查询语句用法
7.18 Day23----标记语言
EntityComponentSystemSamples学习笔记
webrtc中视频采集实现分析(二) 视频帧的分发
Can‘t connect to MySQL server on ‘localhost3306‘ (10061) 简洁明了的解决方法
npm报错Beginning October 4, 2021, all connections to the npm registry - including for package installa
乱码解决方案
随机推荐
7.16 Day22---MYSQL(Dao模式封装JDBC)
Deploy LVS-DR cluster [experimental]
力扣:63. 不同路径 II
处理List<Map<String, String>>类型
跨域问题的解决
IP地址查询
OpenGLES 学习之帧缓存
【问题解决】同一机器上Flask部署TensorRT报错记录
去重的几种方式
Handling List
Unity表格配置编辑工具
JNI基本使用
7.15 Day21---MySQL----Index
npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfonpm ERR! errno ENOTFOUND
es6 学习记录
[原创]STL容器map和unordered_map性能,创建,插入,随机访问速度对比!
Cannot read properties of null (reading 'insertBefore')
实现登录密码混合动态因子,且动态因子隐式
npm报错Beginning October 4, 2021, all connections to the npm registry - including for package installa
【Matlab仿真】:一带电量为q的电荷以速度v运动,求运动电荷产生磁感应强度