bash中如何实现条件判断
条件判断类型:
整数判断(双目判断):
-eq:等于 、equal,测试两个整数之间是否相等,比如$A -eq $B
-gt:大于、greater than
-lt:小于、lesser than
-ne:不等于、no equal
这里也可以用另外一种写法,比如[ 2 -ne 3 ]可以写作[ ! 2 -eq 3 ]
-le:小于或等于、lesser or equal
-ge:大于等于、greater or equal
...
字符判断:
文件判断:单目判断
-e:exist判断文件是否存在
-d:directory判断文件是否为目录
-r:read 判断文件是否可读
-w:write ...........可写
-x:Executable...........可执行
...
条件判断的表达式:
[ expression ]
注意[] 最左和左右需要空格,这里linux把表达式当成命令来判断
[[ expression ]]
同样需要注意空格,这里linux把表达式当成关键字来判断,至于两者区别,暂时存疑
test expression
命令间的逻辑关系:
逻辑与:&&
使用逻辑与的时候,当第一个条件判断为假,则后面条件不再判断
逻辑或:||
使用逻辑或的时候,当第一个条件判断为真,则后面条件不再判断
逻辑非:!
对条件判断结果进行取反
示例:
如果用户user1不存在,则添加user1
[root@logstach ~]# id user1
id: user1: No such user
[root@logstach ~]# ! id user1 &> /dev/null && useradd user1 &> /dev/null
[root@logstach ~]# id user1
uid=3001(user1) gid=3001(user1) groups=3001(user1)
或者
id user1|| useradd user1
如果/etc/inittab文件的行数大于100,就显示'large file'
[ `wc -l /etc/inittab |cut -d' ' -f1 ` -gt 100 ] && echo "large file"
变量的命令规则:
只能用数字、字母和下划线组成
不能用数字开头
不应该与系统环境变量重名
最好做到见名知义
练习:
如果用户存在,就显示已经存在,否则添加此用户
id user1 && echo 'user exists!' || useradd user1
如果用户不存在就添加,否则显示已经存在
!id user1&&useradd user1 ||echo 'user1 already exists!'
如果用户不存在,添加并给其与用户名同名的密码,否则显示其已经存在。
id user1 && echo 'user already exists!'|| useradd user1 && echo ‘user1'|passwd user1 --stdin
[root@logstach ~]# id user1 && echo 'user ?already exists!' || useradd user1 && echo 'user1'|passwd user1 --stdin
uid=3001(user1) gid=3001(user1) groups=3001(user1)
user ?already exists!
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@logstach ~]# id user1 && ?echo 'user ?already exists!' ||( useradd user1 && echo 'user1'|passwd user1 --stdin)
uid=3001(user1) gid=3001(user1) groups=3001(user1)
user ?already exists!
[root@logstach ~]#
注意:这里如果不加()的话,当shell执行到||时不执行useradd user1,但是它会继续往下读,到第二个&&时,把前面 id user1 && echo 'user ?already exists!' || useradd user1当成一个整体,发现整体结果为真,则继续执行后面的内容passwd user1 --stdin。加()可以告诉shell,
useradd user1 && echo 'user1'|passwd user1 --stdin是一个整体。
练习:写一个脚本,完成以下要求:
添加3个用户user1、user2、user3,但要先判断用户是否存在,不存在而后再添加
添加完成后,显示最后添加了哪几个用户,当然,不能包含已经存在而没有添加的
最后显示系统上有几个用户。
#!/bin/bash
! id user1 &> /dev/null && useradd user1 && echo 'useradd user1'
! id user2 &> /dev/null && useradd user2 && echo 'useradd user2'
! id user3 &> /dev/null && useradd user3 && echo 'useradd user3'
TOTAL=`cat /etc/passwd|wc -l`
echo "$TOTAL users."
练习:写一个脚本,完成以下要求:
给定一个用户:
如果uid为0就显示为管理员
否则,就显示其为普通用户
#!/bin/bash
USER=user1
USERID=`grep $USER /etc/passwd|cut -d: -f3`
[ $USERID -eq 0 ] && echo "administrator!" || echo "common user."
条件判断,控制结构:
单分支if语句:
if 判断条件;then
statement1
statement2
..
fi
then如果另起一行,则;可以省略,否则不行
双分支if语句:
if 判断条件;then
statement1
statement2
...
else
statement1
statement2
...
fi
多分支if语句:
if 判断条件1;then
statement1
...
elif 判断条件2;then
statement2
...
elif 判断条件3;then
statement3
....
else
statement4
...
fi
if ls /var ...和if `ls /var` ...的区别:
if ls /var 会根据命令的执行状态结果进行判断,0为真,1-255为假,而if `ls /var`则会报错,因为 `ls /var`返回的是命令的执行结果,if 不能对其进行判断,但是如果添加条件使其能满足条件判断的条件,则可以进行判断,例如:
if [ `ls /var|wc -l` -gt 20 ];then
echo 'large directory'
fi
本文出自 “单季稻” 博客,转载请与作者联系!