Shell(2)数值运算与判断

一. Shell传参方式

第一种传参方式:直接传参

$1 脚本的第一个参数 $2 脚本的第二个参数

[root@shell day2]# cat env.sh 
#!/bin/sh
echo $1 $2
[root@shell day2]# sh env.sh ahui 18
ahui 18

[root@shell day2]# cat env.sh
#!/bin/sh
echo name: $1 
echo age: $2
[root@shell day2]# sh env.sh ahui 123
name: ahui
age: 123
[root@shell day2]# cat env.sh
#!/bin/sh
echo name=$1 
echo age=$2
[root@shell day2]# sh env.sh ahui 123
name=ahui
age=123

第二种传参方式: 赋值传参

[root@shell day2]# cat env.sh
#!/bin/sh
name=$1
age=$2
echo name=$name
echo age=$age
[root@shell day2]# sh env.sh ahui 123
name=ahui
age=123

案例:

[root@shell 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
[root@shell day2]# sh env.sh ahui 123
env.sh: line 2: touc: command not found
name=ahui
age=123
error

第三种传参方式: read读入

[root@shell day2]# cat env.sh 
#!/bin/sh
read -p "Please Input two env: " name age
echo $name $age
[root@shell day2]# sh env.sh
Please Input two env: ahui 123
ahui 123

[root@shell 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
[root@shell day2]# 
[root@shell day2]# sh env.sh
Please Input name env: ahui
Please Input age env: 123
name: ahui
age: 123

案例: 使用三种传参方式来修改IP地址和主机名称

1)修改IP地址
2)修改主机名称

[root@test 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 不支持小数运算

[root@test day2]# expr 1+1
1+1
[root@test day2]# expr ahui
ahui
[root@test day2]# expr 1 + 1
2
[root@test day2]# expr 10 - 1
9
[root@test day2]# expr 10 * 1
expr: syntax error
[root@test day2]# expr 10 \* 1
10

案例: 通过expr判断用户输入的是否为整数

[root@test day2]# expr 1 + 1 &>/dev/null
[root@test day2]# echo $?
0
[root@test day2]# expr 1 + 1.5 &>/dev/null
[root@test day2]# echo $?
2

案例: ahui 不能过99

[root@test 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

执行结果

[root@test day2]# sh env.sh
Please Input name env: ahui
Please Input age env: 1
name: ahui
age: 1
[root@test day2]# sh env.sh
Please Input name env: ahui
Please Input age env: 99
name: ahui
age: 99

$[]

==不支持小数运算 ==

[root@test day2]# echo $[1+1]
2
[root@test day2]# echo $[1*1]
1
[root@test day2]# echo $[1*10]
10
[root@test day2]# echo $[1-10]
-9
[root@test day2]# echo $[10-10]
0
[root@test day2]# echo $[10**10]
10000000000
[root@test day2]# echo $[10%10]
0

$(())

不支持小数 运算效率最高

[root@test day2]# echo $((10*10))
100
[root@test day2]# echo $((10**10))
10000000000
[root@test day2]# echo $((10/10))
1
[root@test day2]# echo $((10/10*10))
10
[root@test day2]# echo $((10/10*10-2))
8
[root@test day2]# echo $((10/10*10-2**4))
-6
[root@test day2]# echo $((10/10*(10-2)**4))
4096

let运算 & i++

不支持小数
以变量的方式做运算

[root@test day2]# let 1+1
[root@test day2]# let 1 + 1
-bash: let: +: syntax error: operand expected (error token is "+")
[root@test day2]# let a=10+10
[root@test day2]# echo $a
20
[root@test day2]# let a=10*10
[root@test day2]# echo $a
100
[root@test day2]# let a=10/10
[root@test day2]# echo $a
1

[root@test day2]# let i++
[root@test day2]# echo $i
1
[root@test day2]# #i++ ======== i=i+1
[root@test day2]# let i++
[root@test day2]# let i++
[root@test day2]# let i++
[root@test day2]# echo $i
4


[root@test day2]# unset i		# 取消变量
[root@test day2]# let ++i
[root@test day2]# let ++i
[root@test day2]# let ++i
[root@test day2]# echo $i
3

i++和++i的区别

直接做运算结果相同
有变量赋值情况下结果不同
i++ 先赋值在运算
++i 先运算在赋值

[root@test ~]# a=1
[root@test ~]# b=1
[root@test ~]# let c=a++
[root@test ~]# let d=++b
[root@test ~]# #let c=a++  c=a+1
[root@test ~]# #let d=++b  d=1+b
[root@test ~]# echo $c
1
[root@test ~]# echo $d
2

bc 支持小数和整数运算

[root@test ~]# yum -y install bc
[root@test ~]# echo 1+1|bc
2
[root@test ~]# echo 10+1.5|bc
11.5
[root@test ~]# echo 10*1.5|bc
15.0

[root@test ~]# echo 10/3|bc
3

awk python

[root@test ~]# awk 'BEGIN{print 10/3}'
3.33333
[root@test ~]# awk 'BEGIN{print 10**3}'
1000
[root@test ~]# awk 'BEGIN{print 10**3.2}'
1584.89
[root@test ~]# awk 'BEGIN{print 10-3.2}'
6.8
[root@test ~]# awk 'BEGIN{print 10-3.2*100/3}'
-96.6667

[root@test ~]# echo 100 200|awk '{print $1*$2}'
20000
[root@test ~]# echo 100 200|awk '{print $1/$2}'
0.5
[root@test ~]# echo 100 200|awk '{print $1**$2}'
inf
[root@test ~]# echo 100 2|awk '{print $1**$2}'
10000

案例: 写一个脚本传参的方式做一个计算器 加减乘除

[root@test ~]# 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

[root@test ~]# test 20 -gt 10
[root@test ~]# echo $?
0
[root@test ~]# test 20 -gt 100
[root@test ~]# echo $?
1

案例

[root@test ~]# test 20 -gt 10 && echo 成立 || echo 不成立
成立
[root@test ~]# test 10 -gt 10 && echo 成立 || echo 不成立
不成立
[root@test ~]# test 10 -eq 10 && echo 成立 || echo 不成立
成立

比较判断: 使用[]

== 整数两端必须有空格==

[root@test ~]# [ 100 -gt 20 ]
[root@test ~]# [ 100 -gt 20]
-bash: [: missing `]'
[root@test ~]# [100 -gt 20 ]
-bash: [100: command not found
[root@test ~]# [ 100 -gt 20 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 100 -gt 100 ] && echo 成立 || echo 不成立
不成立
[root@test ~]# [ 100 -ge 100 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 1000 -ge 100 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 1000 -ne 100 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 1000 -le 100 ] && echo 成立 || echo 不成立
不成立

判断支持命令

[root@test ~]# grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@test ~]# grep bash /etc/passwd|wc -l
1
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -eq 1  ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -ne 0  ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -gt 0  ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ `grep bash /etc/passwd|wc -l` -gt 1  ] && echo 成立 || echo 不成立
不成立

案例: 使用read传参 输入两个整数 是否为整数做判断 然后比对两个数字的大小

[root@test ~]# 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 ]
[root@test ~]# [ 100 -gt 20 -a 20 -eq 30 ] && echo 成立 || echo 不成立
不成立
[root@test ~]# [ 100 -gt 20 -a 20 -le 30 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 100 -gt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
成立
[root@test ~]# [ 100 -lt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
不成立

案例:

[root@test 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  文件可执行为真
!    取反

[root@test day2]# [ -f /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -e /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -f /etc/ ] && echo 文件存在 || echo 文件不存在
文件不存在
[root@test day2]# [ -d /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -e /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -r /etc/ ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -r /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件存在
[root@test day2]# [ -x /etc/hosts ] && echo 文件存在 || echo 文件不存在
文件不存在

[root@test day2]# [ -f /etc/hosts -a -d /etc ] && echo ok || echo error
ok
[root@test day2]# [ -d /etc/hosts -a -d /etc ] && echo ok || echo error
error
[root@test day2]# [ -d /etc/hosts -o -d /etc ] && echo ok || echo error
ok

案例: 判断文件存在则执行

判断bashrc存在则执行

if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

调用函数库

[root@test ~]# cat test.sh
hehe(){
	  echo test
}
hehe
[root@test ~]# sh test.sh
test
[root@test ~]# hehe
-bash: hehe: command not found
[root@test ~]# hehe
-bash: hehe: command not found
[root@test ~]# source test.sh 
test
[root@test ~]# hehe
test
[root@test 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
[root@test day2]# sh test.sh /etc/hosts
/etc/hosts                                                 [  OK  ]
[root@test day2]# sh test.sh /etc/hostssssss
/etc/hostssssss                                            [FAILED]
[root@test day2]# sh test.sh /etc/
/etc/                                                      [FAILED]
[root@test day2]# sh test.sh /etc/passwd
/etc/passwd                                                [  OK  ]

案例2: 判断目录是否存在 如果不存在则创建

[root@test day2]# [ -d hehe ] || mkdir hehe
[root@test day2]# ll
drwxr-xr-x 2 root root   6 Aug  2 11:20 hehe

五.条件表达式:字符串比对

-n 字符串不为0则为真
-z 字符串为0则为真

[root@test day2]# test=aaa
[root@test day2]# echo $test
aaa
[root@test day2]# [ -n $test ] && echo 成立
成立
[root@test day2]# test=""
[root@test day2]# [ -z $test ] && echo 成立
成立
语法格式:
	    [ 字符串1  = 字符串2 ]
		[ 字符串1 != 字符串2 ]
[root@test day2]# [ root = root ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ root = roo ] && echo 成立|| echo 不成立
不成立
[root@test day2]# [ root != roo ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ $name != roo ] && echo 成立|| echo 不成立
成立
[root@test day2]# [ $name = roo ] && echo 成立|| echo 不成立
不成立
[root@test day2]# echo $name
hehe
[root@test day2]# [ $name = hehe ] && echo 成立|| echo 不成立
成立

[root@test day2]# [ $name = roo -o $name = hehe ] && echo 成立|| echo 不成立
成立

案例: 用户输入的字符串为0则退出

[root@test day2]# cat env.sh 
#!/bin/sh
read -p "Please Input name env: " name
[ -z $name ] && echo "必须输入名称" && exit

正则匹配:

[root@test day2]# [[ root =~ ^ro ]] && echo 成立|| echo 不成立
成立
[root@test day2]# 
[root@test day2]# [[ root =~ t$ ]] && echo 成立|| echo 不成立
成立
[root@test day2]# [[ root =~ [a-z]$ ]] && echo 成立|| echo 不成立
成立
[root@test day2]# [[ root =~ [0-9]$ ]] && echo 成立|| echo 不成立
不成立
[root@test day2]# [[ root1 =~ [0-9]$ ]] && echo 成立|| echo 不成立
成立

只允许字母

[root@test day2]# [[ ahu100 =~ [a-z] ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ ahu100 =~ [a-z]$ ]] && echo 成立 || echo 不成立
不成立
[root@test day2]# [[ ahu100 =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
不成立
[root@test day2]# [[ ahui =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
不成立
[root@test day2]# [[ a =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ a =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ ahui =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
成立
[root@test day2]# [[ ah45hui =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
不成立

案例: 要求传参的名称必须为字母 不允许有数字

[root@test 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. 脚本传参方式
    直接传参 $1 $2
    赋值传参 name=$1
    read传参 read -p “提示” name

  2. 数值运算:
    整数: expr $[] $(()) let bc
    都支持: awk python

  3. 数值比较
    test
    [ 整数1 比较符 整数2 ]

    =    -eq  等于
    >    -gt  大于
    >=   -ge  大于等于
    <    -lt  小于
    <=   -le  小于等于
    !=   -ne  不等于
    

    多整数比较 -a -o

  4. 文件判断
    [ 判断符 文件/目录 ]
    -f   文件存在则为真(文件为常规普通文件)
    -d  目录存在则为真
    -e  任意文件存在则为真
    -r   文件可读为真
    -w  文件可写为真
    -x  文件可执行为真
    !    取反
    案例 文件存在则执行
    /etc/init.d/functions

  5. 字符串比对
    -n 值不为0为真
    -z 值为0则为真

    [  root = root ]
    [ root != root ]
    
  6. 正则匹配

    [[ root =~ ^r ]]
    [[ root =~ ^[0-9] ]]
    [[ $name =~ ^[a-Z0-9]+$ ]]
    

    判断是否为整数
    判断传参的个数
    判断传参参数的长度
    expr

    [[ $age = ^[0-9]+$ ]]
    

    判断是否为空

    [ -z $name ]
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值