运算符 与 测试比较 简单脚本设计


运算符


1、算数运算符

+
-
*
/
%

[](())
expr
let

bc

2、测试运算符

test 表达式
或者
[ 表达式 ]

#(一)基本形式:
test EXPRESSION                 # 等同于 [ EXPRESSION ]
[ ! EXPRESSION ]                # 对测试的结果取反
[ EXPRESSION1 -a EXPRESSION2 ]  # 左右两个表达式必须都为真,测试结果才为真
[ EXPRESSION1 -o EXPRESSION2 ]  # 左右两个表达式但凡有一个为真,测试结果就为真


[root@www day03]# [ 1 -eq 1 ];echo ?
0
[root@www day03]# [ ! 1 -eq 1 ];echo?
1
[root@www day03]# [ 1 -eq 1 -a 3 -gt 2 ];echo ?
0
[root@www day03]# [ 1 -eq 1 -a 3 -gt 5 ];echo?
1
[root@www day03]# [ 1 -eq 1 -o 3 -gt 5 ];echo ?
0
[root@www day03]# [ 1 -gt 1 -o 3 -gt 5 ];echo?
1
[root@www day03]# 


# (二)关于字符串的测试
# (1) -n STRING :字符长度为不为0结果才为真,字符串为空(什么都没有)结果为假
[root@www day03]# [ -n "abc" ];echo ?
0
[root@www day03]# [ -n "   " ];echo?
0
[root@www day03]# 

[root@www day03]# [ -n "" ];echo ?
1
[root@www day03]# 

# (2) -z STRING:与-n相反
[root@www day03]# [ -z "abc" ];echo?
1
[root@www day03]# [ -z "      " ];echo ?
1
[root@www day03]# [ -z "" ];echo?
0
[root@www day03]# 

#(3)STRING1 = STRING2
[root@www day03]# [ "egon" = "egon" ];echo ?
0
[root@www day03]# [ "egon" = "egonxx" ];echo?
1
[root@www day03]# [ "egon" == "egon" ];echo ?  # 建议使用
0

# (4)STRING1 != STRING2
[root@www day03]# [ "egon" != "egonxx" ];echo?
0


# (三) 关于整型的比较
-eq:==
-ge:>=
-gt: >
-le: <=
-lt: <
-ne: !=
# 示例
[root@www day03]# [ 11 -eq 11 ]
[root@www day03]# [ 11 -ge 11 ];echo ?
0
[root@www day03]# [ 11 -ge 10 ];echo?
0
[root@www day03]# [ 11 -gt 11 ];echo ?
1
[root@www day03]# [ 11 -gt 10 ];echo?
0
[root@www day03]# [ 10 -lt 11 ];echo ?
0
[root@www day03]# [ 10 -le 10 ];echo?
0
[root@www day03]# [ 10 -ne 10 ];echo ?
1
[root@www day03]# 


# (四)关于文件的比较
-d:文件必须存在,而且得是一个目录
[root@www day03]# [ -d /aaa/ ];echo?
1
[root@www day03]# [ -d /etc ];echo ?
0
[root@www day03]# 


-e : 只要文件存在即可,不区分文件类型
[root@www day03]# [ -e /etc/passwd ];echo?
0
[root@www day03]# [ -e /etc ];echo ?
0
[root@www day03]# 


-f:文件必须存在,而且得是一个普通的文档文件
[root@www day03]# [ -f /etc/passwd ];echo?
0
[root@www day03]# [ -f /etc ];echo ?
1
[root@www day03]# 

-L FILE:文件必须存在,而且得是一个软连接文件
[root@www day03]# ln -s /etc/passwd a.txt
[root@www day03]# ll a.txt 
lrwxrwxrwx 1 root root 11 Aug 26 15:36 a.txt -> /etc/passwd
[root@www day03]# [ -L a.txt ];echo?
0
[root@www day03]# 


文件要存在必须需要有r、w、x权限
-r
-w
-x
[egon@Centos7 day03][ -r a.txt ];echo?
1
[egon@Centos7 day03][ -w a.txt ];echo?
1
[egon@Centos7 day03][ -x a.txt ];echo?
1
[egon@Centos7 day03][ -r a.txt ];echo?
0
[egon@Centos7 day03]-s:当文件内容不为空时结果为真
[root@Centos7 day03]# ll a.txt 
-------r-- 1 root root 0 Aug 26 23:42 a.txt
[root@Centos7 day03]# [ -s a.txt ];echo?
1
[root@Centos7 day03]# echo "hello" >> a.txt
[root@Centos7 day03]# [ -s a.txt ];echo $?
0
[root@Centos7 day03]# 

3、关系运算符

[root@Centos7 ~]# (( 10 == 10 ));echo ?
0
[root@Centos7 ~]# (( 10 >= 10 ));echo?
0
[root@Centos7 ~]# (( 10 > 10 ));echo ?
1
[root@Centos7 ~]# (( 10<11 ));echo?
0
[root@Centos7 ~]# (( 10 <= 10 ));echo ?
0
[root@Centos7 ~]# (( 10 != 10 ));echo?
1
[root@Centos7 ~]# 

# 了解:比较小数
[root@Centos7 ~]# echo "10.3 > 10.1" | bc
1
[root@Centos7 ~]# echo "10.3 > 10.5" | bc
0
[root@Centos7 ~]# echo "10.3 == 10.5" | bc
0
[root@Centos7 ~]# echo "10.3 != 10.5" | bc
1
[root@Centos7 ~]# 

# 示范
[root@Centos7 ~]# cat test.sh 
#!/bin/bash

read -p "float num1>>>: " num1
read -p "float num2>>>: " num2

if [ `echo "num1>num2" | bc` -eq 1 ]
then
    echo "num1 大于num2"
else
    echo "num1 不大于num2"
fi
[root@Centos7 ~]# 
[root@Centos7 ~]# chmod +x test.sh 
[root@Centos7 ~]# ./test.sh 
float num1>>>: 1.3
float num2>>>: 1.5
1.3 不大于 1.5
[root@Centos7 ~]# ./test.sh 
float num1>>>: 1.7
float num2>>>: 1.3
1.7 大于 1.3

4、赋值运算符

[root@Centos7 ~]# unset x
[root@Centos7 ~]# let x+=1
[root@Centos7 ~]# echo x
1
[root@Centos7 ~]# let x+=1
[root@Centos7 ~]# echox
2
[root@Centos7 ~]# 
[root@Centos7 ~]# ((y+=3))
[root@Centos7 ~]# echo y
3
[root@Centos7 ~]# ((y*=10))
[root@Centos7 ~]# echoy
30
[root@Centos7 ~]# 


总结

#1、测试
[ 表达式1 -a 表达式2 ]
(( 表达式1 )) && (( 表达式2 )) 

[ 表达式1 -o 表达式2 ]
(( 表达式1 )) || (( 表达式2 )) 

#2、加上符号代表计算[]
(())

#3、
()()

#4、[[]]与[]基本相同,唯一不同的是[[]]支持正则表达式匹配
[root@Centos7 ~]# [[ -d /etc ]];echo ?
0
[root@Centos7 ~]# [[ 1 -eq 1 ]];echo?
0
[root@Centos7 ~]# [[ 1 -gt 10 ]];echo ?
1
[root@Centos7 ~]# 

# 验证当前用户是否是管理员用户
[root@Centos7 ~]# [USER == "root" ];echo ?
0
[root@Centos7 ~]# 

# 验证当前用户的用户名是否是e开头n结尾的
[egon@Centos7 ~] [[ USER =~ ^e.*n ]];echo ?
0
[egon@Centos7 ~] [[ USER =~ "^e.*n" ]];echo ?  # 强调:正则表达式一定不要加引号
1
[egon@Centos7 ~] 

练习题:

[root@Centos7 day03]# ./num.sh 
传入的参数必须是2个
[root@Centos7 day03]# ./num.sh aa 222
第一个参数必须是整型数字
[root@Centos7 day03]# ./num.sh 111 aaa
第二个参数必须是整型数字
[root@Centos7 day03]# ./num.sh 111 222
验证全部通过
[root@Centos7 day03]# vim num.sh 
[root@Centos7 day03]# 
[root@Centos7 day03]# ./num.sh 111 222
验证全部通过
111 小于 222
[root@Centos7 day03]# ./num.sh 333 111
验证全部通过
333 大于 111
[root@Centos7 day03]# ./num.sh 10 10
验证全部通过
10 等于 10
[root@Centos7 day03]# 

示例1

[root@Centos7 day03]# cat num.sh 
#!/bin/bash

# 第一步:确定参数的个数必须是2个,不是两个就退出
#条件 && cmd1 || cmd2

#if 条件;then
#    cmd1
#else
#    cmd2
#fi

if [ # -ne 2 ];then
   echo "传入的参数必须是2个"
   exit
fi

# 第二步:确定参数1必须是整型数字,不是就退出
if [[ !1 =~ ^[0-9]+]];then
    echo "第一个参数必须是整型数字"
    exit
fi

# 第三步:确定参数2必须是整型数字,不是就退出
if [[ !2 =~ ^[0-9]+]];then
    echo "第二个参数必须是整型数字"
    exit
fi

echo "验证全部通过"
# 第四步:比较两个整型数字,输出结果
[1 -gt 2 ] && echo "1 大于 2"
[1 -lt 2 ] && echo "1 小于 2"
[1 -eq 2 ] && echo "1 等于 $2"
[root@Centos7 day03]# 

示范2

[root@Centos7 day03]# cat login.sh 
#!/bin/bash

db_name="egon"

db_pwd="123"

read -p "请输入你的用户名:" inp_name

read -p "请输入你的密码:" inp_pwd

if  [ inp_name  ==db_name  -a inp_pwd ==db_pwd ];then
   echo "告诉用户登录成功"
else
   echo "告诉用户登录失败"
fi

[root@Centos7 day03]# 

语法

1.格式
if 条件;then
    条件成立时运行的代码
else
    条件不成立时运行的代码
fi

2.格式
if 条件;then
    do
done

#僵尸进程: 
当父进程开启子进程后,父进程还存在,而子进程已经执行完毕.这时子进程会释放资源,只留下一些pid之类的信息.这时子进程就成了僵尸进程zombie. 系统程序和比较优秀的程序都会在一段时间之后自动回收pid关闭僵尸进程.

#孤儿进程:
当父进程开启子进程后,父进程已经结束或关闭,而子进程还在运行,这就成了孤儿进程.当孤儿进程执行完毕之后会变成僵尸进程.而他对应的父进程会变成1号进程init或systemd.然后会很快被1号进程回收.


Shell脚本案例

1.ping命令脚本
=======================
#!/bin/bash
for ip in *
do
    (ping -c3ip &>/dev/null; [ ? == 0 ] && echo "ip:up!" >> ping.log || echo "ip:down" >> ping.log) &
done

for i in {1..10}
do
    (ping -c3 192.168.13.i &>/dev/null; [ ? == 0 ] && echo "192.16.13.i:up!" >> ping.log || echo "192.16.13.i:down" >> ping.log) &
done

sleep 3
tail -f ping.log
=======================
#注意点
1.变量名不能重叠,否则会互相干扰.
2.tail之前需要先等待几秒,否则会找不到文件报错.
3.ping -c1 会导致ping时间过短而无法全部查询所有ip.
=======================执行测试========
[root@db02 ~]# sh ip.sh 1.1.1.1 2.2.2.2 3.3.3.3 xpbag.com
192.16.13.1:up!
192.16.13.2:up!
192.16.13.4:up!
xpbag.com:up!
1.1.1.1:up!
192.16.13.10:down
192.16.13.5:down
192.16.13.7:down
192.16.13.3:down
3.3.3.3:down
2.2.2.2:down
192.16.13.6:down
192.16.13.9:down
192.16.13.8:down


2.比较两个数字的大小的脚本
=======================
#!/bin/bash
read -p "输入第一个数字:" num1
read -p "输入第二个数字:" num2

if (( `echo "num1 > num2" | bc` == 1 ))
then
    echo "num1 > num2"
else
    echo "num1 <= $num2"
fi
=======================执行测试========
[root@db02 ~]# sh num.sh 
输入第一个数字:35.5
输入第二个数字:788
num.sh: line 5: ((: 0 = 1 : attempted assignment to non-variable (error token is "= 1 ")
35.5 <= 788
#报错虽然有结果,但是还是推荐使用 ==1的方式,不要用=1

[root@db02 ~]# vim num.sh
[root@db02 ~]# sh num.sh 
输入第一个数字:89.33
输入第二个数字:889
89.33 <= 889
3.登录脚本
=======================
#!/bin/bash
db_name="aaa"
db_pwd="123"

read -p "输入用户名:" input_name
read -p "输入密码:" input_pwd

if [ input_name ==db_name -a input_pwd ==db_pwd ] ; then
    echo "登录成功"
else
    echo "登录失败"
fi
=======================执行测试========
[root@db02 ~]# sh log.sh 
输入用户名:aaa
输入密码:123
登录成功
[root@db02 ~]# sh log.sh 
输入用户名:adsf
输入密码:wef
登录失败


4.实现2位数的加减乘除运算
=======================
#!bin/bash
a=1
b=2
if [ # -ne 2 ]; then
    echo "请输入两位数字"
    exit
elif [[ !1 =~ ^[1-9][0-9]]]; then
    echo "请输入两位整数"
    exit
elif [[ !2 =~ ^[1-9][0-9]]];then
    echo "请输入两位整数"
    exit
else

echo "简单2位数加减乘除运算器"
echo "a-b=((a-b))"
echo "a+b=((a+b))"
echo "a*b=((a*b))"
echo "a/b=((a/b))"
fi
=======================执行测试========
[root@db02 ~]# sh a.sh 88 99
简单2位数加减乘除运算器
a-b=-11
a+b=187
a*b=8712
a/b=0


5.判断输入的信息是否整数信息的脚本.
=======================
#!/bin/bash
a=1
expr a + 0 &>/dev/null; [? -eq 0 ] && echo "输入的信息为整数" || echo "输入的信息为非>整数"
=======================执行测试========
[root@db02 ~]# sh int.sh 89.3
输入的信息为非整数
[root@db02 ~]# sh int.sh -89.3
输入的信息为非整数
[root@db02 ~]# sh int.sh -89
输入的信息为整数


Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » 运算符 与 测试比较 简单脚本设计

提供最优质的资源集合

立即查看 了解详情