`

ma系列之-10-bash if 算术运算 字符-整数-文件测试 单步执行 脚本退出码

 
阅读更多

 

 

0 绪:

bash中常用的测试比较有三种:
字符测试
整数测试
文件测试

 

下文讲下这三种测试,以及if分支

 

1 写法:

 

    

 [ expression ]
 [[ expression ]]
 test expression

   只有在

1 算术表达式两两使用  -eq  -gt等的时候

2 文件测试

才会使用到 [] 

 

   比如 if grep "\<bash\>" /etc/passwd ; then    

               echo "111"

           fi

    此时if会自动获取右侧grep命令执行后的状态结果,是0则if会认为是满足条件的,会输出111

此时不会使用到[]

  

 

2 整数测试/比较:  数值比较一定加[]


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

 

eg:

[root@hadoop3 ~]# a=3
[root@hadoop3 ~]# b=4
[root@hadoop3 ~]# [ $a -eq $b ]
[root@hadoop3 ~]# echo $?
1

 

3 命令的间逻辑关系:

 

 逻辑与: &&
  第一个条件为假时,第二条件不用再判断,最终结果已经有;
  第一个条件为真时,第二条件必须得判断;
 逻辑或: ||
 逻辑非:  !

 

eg:

[root@hadoop3 ~]# id root &> /dev/null && echo "hello root"
hello root

 

! id user6 && useradd user6   ----> 如果用户user6不存在,就添加用户user6
id user6 || useradd user6   ----> 如果用户存在,则不添加, 如果用户不存在,则添加user6

 

 

4 条件判断,控制结构:

 

1 单分支if语句
if 判断条件; then
  statement1
  statement2
  ...
fi

2 双分支的if语句:
if 判断条件; then
	statement1
	statement2
	...
else
	statement3
	statement4
	...
fi


3 多分支的if语句:
if 判断条件1; then
  statement1
  ...
elif 判断条件2; then
  statement2
  ...
elif 判断条件3; then
  statement3
  ...
else
  statement4
  ...
fi

 

 

if脚本练习:

练习,写一个脚本,完成以下要求:
给定一个用户:
	1、如果其UID为0,就显示此为管理员;
	2、否则,就显示其为普通用户;

NAME=user16
if [ `id -u $NAME` -eq 0 ]; then
  echo "Admin"
else
  echo "common user."
fi


给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
#!/bin/bash
A=`grep '^$' /etc/inittab | wc -l`
if [ $A -gt 0 ]; then
 echo "$A"
else
 echo "no blank"
fi


给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。
#!/bin/bash
USERNAME=user1
USERID=`id -u $USERNAME`
GROUPID=`id -g $USERNAME`
if [ $USERID -eq $GROUPID ]; then
  echo "Good guy."
else
  echo "Bad guy."
fi


判断当前系统上是否有用户的默认shell为bash;
   如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
total = `grep "\<bash$" /etc/passwd &> /dev/null | wc -l`
if [ $total -eq 0 ]; then
   echo "no such bash user"
else
   echo "the bash users num is $total"  

 

 
5 shell中的整数算术运算:
1、let 算术运算表达式(注意 =右侧表达式不能有空格)
 let C=$A+$B
2、$[算术运算表达式]   这个用的多一点
 C=$[$A+$B]
3、$((算术运算表达式))
 C=$(($A+$B))
4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
 C=`expr $A + $B`

 
eg:
[root@chinadaas109 ~]# a=3
[root@chinadaas109 ~]# b=4
[root@chinadaas109 ~]# let c=$a + $b
-bash: let: +: syntax error: operand expected (error token is "+")
[root@chinadaas109 ~]# let c=$a+$b
[root@chinadaas109 ~]# echo $c
7
 
eg:
给脚本传递两个参数(整数);
显示此两者之和,之乘积;
#!/bin/bash
#
if [ $# -lt 2 ]; then
  echo "Usage: cacl.sh ARG1 ARG2"
  exit 8
fi

echo "The sum is: $[$1+$2]."
echo "The prod is: $[$1*$2]."
 
 
6 文件测试:
 
-e FILE:测试文件是否存在(e = exists)
-f FILE: 测试文件是否为普通文件 (f = file)
-d FILE: 测试指定路径是否为目录 (d = direcoty)
-r FILE: 测试当前用户对指定文件是否有读取权限; ( r = read)
-w FILE: 测试当前用户对指定文件是否有写取权限; ( w = write)
-x FILE: 测试当前用户对指定文件是否有执行取权限; ( x = execute) 
 
eg:
使用方式:
[ -e /etc/inittab ]
[ -x /etc/rc.d/rc.sysinit ] 
eg: 如果是一个文件 显示文件名 否则显示不存在
[root@chinadaas109 zhoumingtest]# cat fortest.sh 
#!/bin/sh
#

filename=/etc/inittab
if [ -e $filename ]; then
        echo "filename is: $filename"
else
        echo "no $filename is here!"
fi
 
7 展示单步执行的结果
[root@chinadaas109 zhoumingtest]# cat fortest.sh 
#!/bin/sh
#

filename=/etc/inittab
if [ -e $filename ]; then
        echo "filename is: $filename"
else
        echo "no $filename is here!"
fi

[root@chinadaas109 zhoumingtest]# bash -x fortest.sh 
+ filename=/etc/inittab    第一步执行赋值操作
+ '[' -e /etc/inittab ']'  第二部执行if判断操作
+ echo 'filename is: /etc/inittab' 第三部执行echo打印操作
filename is: /etc/inittab
 
8 脚本退出码:
exit: 退出脚本   0表示正常退出 非0表示异常退出
exit #
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码;
 
9 字符测试:
==:测试是否相等,相等为真,不等为假,
(注意在 变量1 = 变量2 或者 变量1 = string时,shell会自动识别并将=理解成== 而不是赋值操作)
!=: 测试是否不等,不等为真,等为假
>
<
-n string: 测试指定字符串是否为空,空则真,不空则假  n可以理解为null
-z string: 测试指定字符串是否不空,不空为真,空则为假
使用的时候,==左右两侧的变量需要和==之间有空格,写法如下
[root@chinadaas109 ~]# a=hello
[root@chinadaas109 ~]# b=hi
[root@chinadaas109 ~]# [ $a == $b ]
[root@chinadaas109 ~]# echo $?
1
 
字符比较练习:
传递一个参数(单字符就行)给脚本,如参数为q、Q、quit或Quit,就退出脚本;否则,就显示用户的参数;
#!/bin/bash
#
if [ $1 = 'q' ];then     这里的=会被shell理解为 == 
  echo "Quiting..."
  exit 1
elif [ $1 = 'Q' ];then
  echo "Quiting..."
  exit 2  
elif [ $1 = 'quit' ];then
  echo "Quiting..."
  exit 3 
elif [ $1 = 'Quit' ];then
  echo "Quiting..."
  exit 4  
else
  echo $1
fi


 
 
 
 
 
 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics