条件测试类型:
整数:
字符:
文件:
条件测试的表达式:
#test
例如:
#test 2>3
#echo $?
#[ EXPRESSION ] 注意这里前后一定要有空格。
#[[ EXPRESSION ]] 关键字测试法。对字符有效,并且字符用""引起来。
整数比较:
等于:
#NUM1 -eq NUM2
测试2个整数是否相等。
不等:
#NUM1 -ne NUM2
测试一个整数是否不等:不等为ture,否则为false。
大于:
#NUM1 -gt NUM2
测试一个整数是否大于另一个数:大于为ture,否则为false。
小于:
#NUM1 -lt NUM2
测试一个整数是否小于另一个数:小于为ture,否则为false。
大于或等于:
#NUM1 -ge NUM2
小于或等于:
#NUM1 -le NUM2
例如:
#A=3
#B=5
#[ $A -eq $B ]
#echo $?
#test $A -ge $B && echo "$A" || echo "$B" 比较2个数的大小并输出大的结果。
#[ $A -ge $B ] && $A || $B
字符串比较:
等于:等于为真,不等为假。
==
'STRING1' == 'STRING2'
例如:
#[ "$A" == "$B" ]
不等:不等为true,相等为false。
!=
大于:
>
小于:
<
是否存在字符串:
-n SRTING 有字符为真,没有为假。
-z STRING 有字符为假,没有为真。
例如:
测试用户名是否一致:
#!/bin/bash
if [ `id -n -u $1` == `id -n -g $1` ];then
echo "match"
else
ecno "no matchi"
fi
#./test.sh root
或
#!/bin/bash
if !id &> /dev/null;then
echo "no such a user"
exit 6
fi
if [ $1 == `id -n -g $1` ];then
echo "match"
else
ecno "no matchi"
fi
#./test.sh root
写一个脚本:
传递一个参数给脚本,入参数为q quit Q,就退出脚本,否则就显示用户的参数。
#!/bin/bash
if [ $1 == 'Q' ];then
echo "exit"
exit 1
elif [ $1 == 'q' ];then
echo "exit"
exit 2
elif [ $1 == 'quit' ];then
echo "exit"
exit 3
eles
echo $1
fi
传递三个参数给脚本,第一个为整数,第二位算术运算符,第三个为整数,将计算的结果显示出来,要求保留2为精度。
#echo "scale=2;111/22;"
或者
#bc <<< "scale=2;111/22;"
文件比较:
-e FILE|DIR 判断是否存在。
-f FILE 是否是普通文件。
-d FILE 是否是目录。
-l FILE 是否是链接文件。
-r FILE 是否有读权限,仅限当前用户。
-w FILE 是否有写权限,仅限当前用户。
-x FILE 是否有执行权限,仅限当前用户。
例如:
#[ -e /tmp/abc ] || mkdir /tmp/abc
#[ ! -e /tmp/abc ] && mkdir /tmp/abc
# [ -e /etc/init.d/functions ] && source /etc/init.d/functions 如果文件存在就加载。
# [ -x /etc/init.d/network ] && /etc/init.d/network start 如果文件存在就运行。
#[ -x /bin/hostname ] && MYHOSTNAME= `/bin/hostname` 如果文件可以执行,就执行并赋值给MYHOSTNAME。
# [ -z $HOSTNAME ] && MYHOSTNAME='localhost'
exit:
bash内置命令,表示从此处退出。后边可以跟上自定义的返回值。
例如:
#exit
或在脚本中使用:
exit
或
exit 127
逻辑关系运算:
表达式的结果进行逻辑运算。
&&;逻辑与
ture && ture = ture
false && any = false
第一个条件为假,第二个条件不用判断,第二个条件肯定为假。
第一个条件为真,第二个条件必须得判断。
例如:
#!id hadoop & > /dev/null && useradd hadoop 检查是否存在hadoop,若不存在新建用户。
||;逻辑或
ture || false =ture
false || false =false
第一个为真结果肯定为真。
例如:
#id hadoop & > /dev/null || useradd hadop 检查是否存在hadoop,若不存在新建用户。
短路操作符:
判断结果只需要判断前面的真假就行。执行过程就不在向后面执行了。
格式可以理解为:
[条件 执行1] 执行2 ...
短路逻辑运算:
与:只要一个为假,结果一定为假。
或:只要一个为真 ,结果一定为真。
变量名命名规范:
1.只能包含字母,数字和下划线。并且不能以数字开头。
2.不应该跟系统中已有的环境变量重名。系统上的环境变量都是大写的。
一般建议不要用全大写,避免和环境变量冲突。
3.最好做到见名知意。
条件判断:
linux中,真的值为0,其他值都为假。这个值一定是命令执行状态的返回值。
bash算数运算符:
+
-
*
/
%
++
--
算术运算;
#let 算数运算表达式
例如:
#A=4
#let A++
#echo $A
5
#let SUM=2+3
#echo $SUM
5
#echo "the sum of 2+3 is `expr 2+3`"
$[运算表达式]
例如:
#SUM=$[2+3]
#echo $SUM
5
#DAYS=$[$(`date +%s`)/24/60/60]
15602 计算从1970年1月1日到现在经历的整数天
。
#SUM=$[$A+$B]
$((算数运算表达式))
例如:
#SUM=$((3/2))
#echo $SUM
1 bash只进行整数运算,小数部分被忽略。
#SUM=(($A+$B))
expr 算数运算表达式。
表达式中各操作数及运算符之间要有空格,而且要使用命令引用。
例如:
#A=4
#B=3
#C=`expr $A + $B`
#echo $C
7
测试脚本是否有错误:
#bash -n BASHNAME.sh 若有错误会提示,但是比较模糊,仅供参考。
#bash -x BASHNAME.sh 单步执行。
#bc 精确计算,默认是交互式。多个参数使用;分号隔开。
scale=NUM 保持小数点后NUM位的精度。
quit 退出
例如:
#echo 'scale=6;3/2'
1.500000
#SECS=$(date +%s)
#echo "sacle=2;$SECS/86400" | bc
15602.86
#echo "sacle=6;$(date +%S)/86400" | bc
15602.86
bash赋值表达式;
=
+=
-=
*=
/=
SUM=$[$SUM+1]
SUM++
SUM
脚本实例:
判断文件大小,超过100行的为大文件。
#!/bin/bash
LINES=`wc -l /etc/inittab`
FINLINES=`ECHO $LINES|cut -d' ' -f1`
[ $FINLINES -gt 100 ] && echo "this is a big file." || echo "this is a small file."
如果用户存在,就显示用户已存在,否则就添加此用户。
#!/bin/bash
id test && echo "user test exists." || useradd test
如果用户不存在,就添加。否则显示用户已存在。
#!/bin/bash
!id test && useradd test || echo "user test exists"
如果用户不存在,添加并设置密码,否则显示其已存在。
#!/bin/bash
!id test && useradd test && echo "123456"|passwd --stdin test || echo "user test exists"
实例1:
1.添加3个用户user1,user2,user3,但要先判断用户是否存在,不存在而后再添加。
2.添加完成后,显示一共添加了几个用户,不包括事先存在没有添加的。
3.最后显示当前系统上一共有多少个用户。
#!/bin/bash
!id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &>/dev/null || echo "user1 exists."
!id user2 &> /dev/null && useradd user2 && echo "user2" | passwd --stdin user2 &>/dev/null || echo "user2 exists."
!id user3 &> /dev/null && useradd user3 && echo "user3" | passwd --stdin user3 &>/dev/null || echo "user3 exists."
USERS=`wc -l /etc/passwd|cut -d: -f1`
echo "$USERS users."
实例2:
给定一个用户:
1.如果其UID为0,就显示为管理员
2.否则,就显示为普通用户。
#!/bin/bash
NAME=test
USERID=`id -u $NAME`
[ $USERID -eq 0 ] && echo "Admin" || echo "common user."
#!/bin/bash
NAME=test
USERID=`id -u $NAME`
if [ $USERID -eq 0 ] ; then
echo "Admin"
else
echo "User"
fi
实例3:
判断当前系统上是否有用户的默认shell为bash,如果有,显示出有多少个这类用户。
#!/bin/bash
grep "\<bash$" /etc/passwd &> /dev/null
RETVLA=$?
if [ $RETVAL -eq 0 ] ; then
USERS=`grep "\<bash$" /etc/passwd | wc -l`
echo "$USERS users's shell is bash."
else
echo "no such users"
fi
实例4:
接实例3,如果有,则显示其中1个用户名。
#!/bin/bash
grep "\<bash$" /etc/passwd &> /dev/null
RETVLA=$?
if [ $RETVAL -eq 0 ] ; then
USERS=`grep "\<bash$" /etc/passwd |head -l|cut -d: -f1`
echo "$USERS is one of them."
else
echo "no such users"
fi
实例5:
给定一个文件,例如/etc/inittab,判断这个文件中是否有空白行,如果有, 则显示其空白行数,若没有,则显示没有。
#!/bin/bash
cat test.txt|grep '^$' &> /dev/null
BLINK=$?
if [ $BLINK -eq 0 ] ;then
WC=`cat test.txt| grep '^$' |wc -l`
echo "blank line is $WC"
else
echo "no blank line."
fi
实例6:
给定一个用户,获取其密码警告期限。而后判断用户密码使用期限是否已经小于警告期限。
提示:计算方法,最长实际用期限减去已经使用的天数即为剩余使用期限:如果小于,则显示“warning”,否则,就显示“ok”。
#!/bin/bash
W=`grep"student" /etc/shadow | cut -d: -f6`
S=`date+%s`
T=`expr$S/86400`
L=`grep"^student" /etc/shadow | cut -d: -f5`
N=`grep"^student" /etc/shadow | cut -d: -f3`
SY=$[$L-$[$T-$N]]
if[ $SY -lt $W ]; then
echo'Warning'
else
echo'OK'
fi
实例7:
给定一个文件:
如果是一个普通文件,就显示为普通文件。
如果是一个目录,就显示问目录
否则,则显示无法识别此文件。
#!/bin/bash
FLIE=/etc/inittab
if [ -e $FILE];then
echo "NO such a file."
exit 6
fi
if [ -f $FILE];then
echo "Common file."
elif [-d $FILE];then
echo "DIretory."
else
echo "Unkouwn."
fi