linux基础之shell编程(2)-条件判断,算数运算,测试

时间:2023-02-06 21:27:47

bash中如果实现条件判断?


条件测试类型

  • 整数测试
  • 字符测试
  • 文件测试

条件测试的表达式

有三种

[ expression ]  --方括号与表达式之间一定要有一个空格
[[ expression ]] 
test expression

整数测试


-eq: 测试两个整数是否相等 例:$A -eq $B -ne: 测试两个整数是否不等 不等为真,相等为假 -gt: 测试一个数是否大于另一个数;大于,为真;否则,为假; -lt: 测试一个数是否小于另一个数;小于,为真;否则,为假; -ge: 大于或等于 -le: 小于或等于

命令的间逻辑关系


逻辑与: &&
    第一个条件为假时,第二条件不用再判断;
    第一个条件为真时,第二条件必须得判断;
逻辑或: ||
    第一个条件为假时,第二条件必须得判断;
    第一个条件为真时,第二条件不用再判断;

例:比较两个数大小

[root@iZ28g26851kZ ~]# A=12
[root@iZ28g26851kZ ~]# B=15
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比较大" || echo "B比较大"
B比较大
[root@iZ28g26851kZ ~]# A=20
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比较大" || echo "B比较大"
A比较大
[root@iZ28g26851kZ ~]# 

如果A大于B则[ $A -gt $B ] 为真,需要执行(判断)echo "A比较大"
最终[ $A -gt $B ] && echo "A比较大" 为真,所以不用再执行echo "B比较大"

if语句


——–单分支

if 判断条件 ;then
    statement1
    ...
fi

——–双分支

if 判断条件 ;then
    statement1
    ...
else
    statement2
    ...
fi

——–多分支

if 判断条件 ;then
    statement1
    ...
elif 判断条件2 ; then
    statement2
    ...
elif 判断条件3 ; then
    statement3
    ...
else
    statement4
    ...
fi

例:判断用户user1是否存在,存在显示用户已存在,不存在则创建用户,密码和用户名相同

adduser.sh

#!/bin/bash
NAME=user1
if id $NAME &> /dev/null; then
   echo "用户已存在"
else
   echo "当前一共有用户`wc -l /etc/passwd | cut -d" " -f1`人"
   echo "用户不存在,正在创建用户"
   useradd $NAME
   echo $NAME | passwd --stdin $NAME &> /dev/null
   echo "当前一共有用户`wc -l /etc/passwd | cut -d" " -f1`人"
fi

执行结果

[root@iZ28g26851kZ ~]# ./adduser.sh 
当前一共有用户30人
用户不存在,正在创建用户
当前一共有用户31人
[root@iZ28g26851kZ ~]# ./adduser.sh 
用户已存在
[root@iZ28g26851kZ ~]# 

算数运算


之前说了,shell中默认所有变量都是字符串,所以要进行算数运算就必须用命令处理

let

let 算数运算表达式
例:

[root@iZ28g26851kZ ~]# b=23
[root@iZ28g26851kZ ~]# a=12
[root@iZ28g26851kZ ~]# let c=$a+$b
[root@iZ28g26851kZ ~]# echo $c
35
[root@iZ28g26851kZ ~]# 

$[算数运算表达式]

例:

[root@iZ28g26851kZ ~]# c=$[$a+$b*2]
[root@iZ28g26851kZ ~]# echo $c
58
[root@iZ28g26851kZ ~]# 

$((算数运算表达式))

例:

[root@iZ28g26851kZ ~]# c=$(($a*2+$b*2))
[root@iZ28g26851kZ ~]# echo $c
70
[root@iZ28g26851kZ ~]# 

expr


expr 一般用于整数运算,会自动取整,小数点后面的直接去掉
且 运算数与运算符号之间一个要有一个空格,如果没有空格就会像下面这样

[root@iZ28g26851kZ ~]# expr 10/3
10/3
[root@iZ28g26851kZ ~]# 

原样输出了,,所以必须要加上空格
例:

[root@iZ28g26851kZ ~]# expr 10 / 3
3
[root@iZ28g26851kZ ~]# expr 10 + 3
13
[root@iZ28g26851kZ ~]# expr 10 - 3
7
[root@iZ28g26851kZ ~]# expr 10 * 3
expr: syntax error

可以看出,加,减,除,都没有问题,唯独乘法运算时居然说语法错误,
好吧,这里expr应该是吧 * 当匹配字符用了,所以需要转义一下

[root@iZ28g26851kZ ~]# expr 10 \* 3
30

ok,这样就搞定了

文件测试


-e FILE: 测试文件是否存在
-f FILE: 测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r FILE: 测试当前用户对指定文件是否有读取权限
-w FILE: 测试当前用户对指定文件是否有写入权限
-x FILE: 测试当前用户对指定文件是否有执行权限

例:判断一个文件是否存在,存在则显示其行数

#!/bin/bash
FILENAME=/etc/passwd
if [ -e $FILENAME ]; then
   echo "文件存在"
   echo "文件一共有` wc -l $FILENAME | cut -d" " -f1`行"
else
   echo "文件不存在"
fi

如何中途退出脚本


在需要退出的地方使用exit #即可,#号为一个退出状态(0-255的一个数值)。

0:表示脚本执行成功
1-255:表示执行失败
也可以什么都不返回,脚本会默认返回上一条结果的执行状态

例:
exittest.sh

#!/bin/bash
echo "第一行"
echo "第二行"
exit 18
echo "第三行"

执行结果

[root@iZ28g26851kZ ~]# ./exittest.sh 
第一行
第二行
[root@iZ28g26851kZ ~]# echo $?
18
[root@iZ28g26851kZ ~]# 

显示执行脚本的过程


有些时候,当脚本太长,出错之后无法快速找到原因,可以使用 bash -x xxx.sh来执行脚本,该命令可将脚本执行的过程显示出来
例:判断文件是否存在

filetest.sh

#!/bin/bash
#
FILENAME=/etc/passwd
if [ -e $FILENAME ];then
  echo "文件存在"
else
  echo "文件不存在"
fi

执行

[root@iZ28g26851kZ ~]# bash -x filetest.sh 
+ FILENAME=/etc/passwd
+ '[' -e /etc/passwd ']'
+ echo $'\346\226\207\344\273\266\345\255\230\345\234\250'
文件存在
[root@iZ28g26851kZ ~]# 

这样就可以很方便的检查脚本了

字符测试


相等比较

[ string == string ]

记住,[空格string空格==空格string空格]
少一个都不行哦~~
例:

[root@iZ28g26851kZ ~]# [ "asd" == "asdd" ]
[root@iZ28g26851kZ ~]# echo $?
1
[root@iZ28g26851kZ ~]# [ "asd" == "asd" ]
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]# 

不等比较

[ string != string ]

例:

[root@iZ28g26851kZ ~]# [ "asd" != "asd" ]
[root@iZ28g26851kZ ~]# echo $?
1
[root@iZ28g26851kZ ~]# [ "asd" != "asdd" ]
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]#