bash脚本编程之三 条件判断及算术运算

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

bash中如何实现条件判断?

1、条件测试类型:

              整数测试

              字符测试

              文件测试

条件测试表达式:

[ expression ]

[ [ expression ] ]

test expression

整数比较:

           -eq:测试两个整数是否相等,比如$A -eq $B

           -ne:测试两个整数是否不等:不等,为真;相等,为假

           -gt:测试一个数是否大于另一个数:大于,为真;否则,为假

           -lt:测试一个数是否小于另一个数:小于,为真;否则,为假

           -ge:大于或等于

           -ls:小于或等于

命令的间逻辑关系:

    逻辑与:&&

               第一个条件为假时,第二条件不用再判断,最终结果已经有

               第一个条件为真时,第二条件还需再判断

    逻辑或:||

               第一个条件为真时,第二条件不用再判断,最终结果已经有

 

               第一个条件为假时,第二条件还需再判断

 

变量名称:1、只能包含字母、数字和下划线,并且不能数字开头

                  2、不应该跟系统中已有的环境变量重名

                  3、最好见名知义

 

条件判断,控制结构:

单分支if语句

if 判断条件;then

    statement1

    statement2

    …

fi

 

 双分支的if语句:

if 判断条件;

then 

    statement1

    statement2

    …

else

     statement3

     statement4

     …

fi

 

多分支的if语句:

if 判断条件1;then

   statement1

   …

elif 判断条件2;then

      statement2

      …

elif 判断条件3;then

     statement3

     …

else

     statement4

      …

fi

 

shell中如何进行算术运算:

A=3

B=6

1、let算术运算表达式

      let C=$A+$B

2、$[算术运算表达式]

     C=$[$A+B]

3、$((算术运算表达式)) 

      C=$(($A+$B))

4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引入

     C=` expr $A + $B `

 

 

条件判断例子:

 (1)添加5个用户,user1,……,user5

 (2)每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息

 (3) 每个用户添加完成后,都要显示用户某某已经成功添加

!id user1  &>/etc/null && useradd user1 && echo "user1 " | passwd --stdin user1  &> /etc/null && echo "user1 add successfully"  || echo "user1 exists"

如果不存在user1就添加user1用户,将user1用户名发送给passwd,显示user用户添加成功

否则若存在user1则显示user1已存在

 

变量名称例子:       

        如果用户存在,就显示用户已存在;否则,就添加此用户

        id user1 && echo "user1 exists." || useradd user1

        如果用户不存在,就添加;否则,显示其已经存在

        ! id user1 && useradd user1 ||echo "user1 exists."

       如果用户不存在,就添加并且给密码;否则,显示其已经存在

       ! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exits"

 

写脚本的一大堆练习啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊:

练习,写一个脚本,完成以下要求:

1、添加3个用户user1,user2,user3;但要先判断用户是否存在

2、添加完成后,显示一共添加了几个用户;当然不能包括因为事先存在而没有添加的

3、最后显示当前系统上共有多少个用户

#!/bin/bash

num=0

! id user1 &>/etc/null && useradd user1 &&  echo "user1" | passwd --stdin user &> /etc/null && echo "useradd user1 successfully"  || echo "user1 exists"

USERS=`wc -l  -/etc/passwd`

echo "$USERS users"

 

练习,写一个脚本,完成以下要求:

给定一个用户:

       1、如果其UID为0,就显示此为管理员

       2、否则,就显示其为普通用户

       bash脚本编程之三  条件判断及算术运算

        !!!数值比较一定要加[]

 

           用if来做

           如果UID为0;那么

                   显示为管理员

           否则

            显示为普通用户

            bash脚本编程之三  条件判断及算术运算

练习:写一个脚本

     判断当前系统上是否有用户的默认shell为bash;

     如果有,就显示有多少个这类用户;否则,就显示没有这类用户;

#!/bin/bash

#

grep "\<bash$"  /etc/passwd &> /dev/null

RETVAL=$?               !!!!$?:上一个命令的退出状态或函数的返回值

if  [  $RETVAL -eq 0] ; then

    USERS=`grep "\<bash$" /etc/passwd | wc -l`

    echo "The shells of $USERS users is bash."

else 

     echo "No such user."

fi

 

练习:写一个脚本

判断当前系统上是否用户的默认shell为bash;

如果有,就显示其中一个的用户名,否则,就显示没有这类用户;

#!/bin/bash

AUSER=`grep "bash$"  /etc/passwd | head -1 | cut -d: -f1`

REVTAL=$?

if [  $REVTAL -eq 0 ]; then

   echo "$AUSER is one of such users"

else 

 echo  "no such user"

fi

 

练习:写一个脚本

给定一个文件,比如/etc/inittab

判断这个文件中是否有空白行

如果有,则显示其空白行数;否则,显示没有空白行

bash脚本编程之三  条件判断及算术运算

练习:写一个脚本

给定一个用户,判断其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

进一步要求,不使用id命令获得其id号?

根据/etc/passwd中的7个字段来搞

/etc/passwd中7个字段:

                                      sam:x:200:50:Samsan:/usr/sam:/bin/sh

                                      用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

所以可以这样获取id:USERID=grep '^\$(USERNAME)' /etc/passwd | cut -d: f3

 

练习:写一个脚本

给定一个用户,获取 其密码警告期限;

而后判断用户最近一次修改密码时间距今天是否已经小于警告期限;

        提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;

如果小于,则显示"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

 

练习:写一个脚本

判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示“Some command will gone.”否则显示“OK”。

#!/bin/bash

num=`history | tail -l | cut -d'  '   -f2`

if [ $num -gt 1000 ] ;then

    echo "Some command will gone."

else 

    echo "OK."

fi

 

练习:写一个脚本,完成以下任务

1、使用一个变量保存一个用户名

2、删除此变量中的用户,且一并删除其家目录

3、显示“用户删除完成”类的信息