bash脚本:条件测试及算术运算

条件测试类型:

整数:

字符:

文件:



条件测试的表达式:

#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


你可能感兴趣的:(bash,算术运算,条件测试)