Shell攻关之条件判断与流程控制

                 条件判断与流程控制

一、条件判断式语句
1.按照文件类型判断
(1)
在这里插入图片描述

常用:

    -d 文件   判断该文件是否存在,并且是否为目录文件(是目录为真)
    -e 文件   判断该文件是否存在(存在为真)
    -f 文件   判断该文件是否存在,并且是否为普通文件(是普通文件为真)

(2)两种判断格式

test -e /root/install.log

[-e /root/install.log]   

注:可以再次使用:

预定义变量$?
echo $?
返回0表示上一条命令成功执行
返回非0表示上一条命令未成功执行

上述方式不能直观的表现想要的结果,可以使用

[-d /root] && echo "yes" || echo "no" 

2.按照文件权限进行判断
在这里插入图片描述

常用:
     -r文件   判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)

     -w文件   判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)

     -x文件   断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)

例子:

[-w /root/install.log]

只要该文件拥有该权限,不会判断是所属者或者所属组是否拥有。

3.两个文件之间进行比较


文件1 -nt 文件2         判断文件1的修改时间是否比文件2的新(如果新则为真)	

文件1 -ot 文件2         判断文件1的修改时间是否比文件2的旧(如果旧则为真)	

文件1 -ef 文件2         判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

4.两个整数之间的比较
在这里插入图片描述

5.字符串的判断
在这里插入图片描述
eg:

[-z $name] && echo yes || echo no


aa=11
bb=22
["$aa" == "$bb"]   
# 比较字符串,注意,这里的$aa 和 $bb加了双引号

6.多重条件判断
在这里插入图片描述

二、单分支if语句
1.

if [ 条件判断式 ];then
    程序
fi

或者

if [ 条件判断式 ]
    then
    程序
fi

单分支条件语句需要注意几个点:
if语句使用fi结尾,和一般语言使用大括号结尾不同
[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

2.例子1.判断登陆的用户是否root
eg:

#!/bin/bash

test=$(env | grep "USER" | cut -d "=" -f 2)

if [ "$test" == "root" ]

    then

    echo "Current user is root."
fi

注:then后面跟符合条件之后执行的程序,可以放在[]之后,用";“分割。也可以换行写入,就不需要”;"了

3.例子2:判断分区使用率

#!/bin/bash

rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' |  cut -d "%" -f 1)

if  [ "$rate" -ge "80" ]

    then

        echo "/dev/sda1 is full"

fi

三、双分支if条件语句
1.

if [ 条件判断式 ]
   then
     条件成立时,执行的程序
   else
     条件不成立时,执行的另一个程序
fi

2.例子3 输入一个字符串,判断是不是目录

read  -t 30  -p "please input a dir:" dir

# 等待30秒,输出提示信息

if [-d "$dir"]

    then 

            echo "yes"

    else 

            echo "no"

fi

3.例子4 判断Apache服务是否正常启用

ps aux | grep httpd | grep -v grep    #查询httpd是否启动

注:ps aux:查看系统中所有正在运行的进程
grep -v grep:取反,取出不包含grep的行

脚本:
#!/bin/bash

test=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]
        then
                echo "httpd is ok!"
        else
                /etc/rc.d/init.d/httpd start
                echo "restart httpd !!"
fi

注意:脚本名不应该与服务名相同

四、多分支if条件语句
1.

if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
    then
        当条件判断式2成立时,执行程序2
...省略更多条件...
else
        当所有条件都不成立时,最后执行此程序‘
fi

2.例子5 简单计算器

#!/bin/bash 

read -t 30 -p "Please input num1:" num1 

read -t 30 -p "Please input num2:" num2 

read -t 30 -p "Please input operator:" ope 

if [ -n "$num1" -a -n "$num2" -a -n "$ope" ] 

    then 

        test1=$(echo $num1 | sed 's/[0-9]//g') 

        test2=$(echo $num2 | sed 's/[0-9]//g') 

            if [ -z "$test1" -a -z "$test2" ] 

                then 

                    if [ "$ope" == '+' ] 

                        then 

                            result=$(($num1+$num2)) 

                    elif [ "$ope" == '-' ] 

                        then 

                            result=$(($num1-$num2)) 

                    elif [ "$ope" == '/' ] 

                        then 

                            result=$(($num1 / $num2)) 

                    elif [ "$ope" == '*' ] 

                        then 

                            result=$(($num1*num2)) 

                    else 

                        echo "Error: the input operator is worng, please input +-*/" 

                        exit 111 

                    fi 

                else 

                    echo "Error: Please input numbers!"  

                    exit 222 

                fi 

        echo "$num1 $ope $num2 is $result" 

    else 

        echo "Error: You input null value!" 

        exit 333 

fi

3.例子6 判断用户输入的是什么文件

#!/bin/bash 

read -t 30 -p "Please input a file name:" file 

if [ -z "$file" ] 

    then 

        echo "Error, please input a file name!" 

        exit 11 

elif [ ! -e "$file" ] 

    then 

        echo "Your input is not a file name!" 

        exit 22 

elif [ -f "$file" ] 

    then 

        echo "$file is a regular file!" 

elif [ -d "$file" ] 

    then 

        echo "$file is a directory !" 

else 

    echo "$file is another file!" 

fi

五、多分支case语句
1.
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in

	    "值1")

		        如果变量的值等于值1,则执行程序1

		        ;;                          #注意分号(;)一定要加

	    "值2")

		        如果变量的值等于值2,则执行程序2

		        ;;

		        …省略其他分支.…

	    *)

		        如果变量的值都不是以上的值,则执行此程序

		        ;;

esac 

2.例子7

#!/bin/bash

read -t 30 -p "please input yes/no:" cho 

case "$cho" in

        "yes")

            echo "yes"

            ;;  

        "no")

            echo "no"

            ;;  

        *)  

            echo "please input yes/no again!!!"

            ;;  

esac

六、for循环
1.语法一

for 变量 in 值1 值2 值3...
    do
        程序
    done

eg:

#!/bin/bash

for i in 1 2 3 4 5
    do
        echo $i
    done

2.例子8 for循环批量解压压缩包

##!/bin/bash

cd /root/test

ls *.tar.gz > ls.log            #(>覆盖) 

ls *.tgz >> ls.log              #(>>追加)

for i in $( cat ls.log )

        do  

             tar -czf $i &> /dev/null

			#把执行过程中所有输出信息丢到回收站,不显示在屏幕上

        done

rm -rf ls.log

3.语法二

for ((初始值;循环控制条件;变量变化))
    do
        程序
    done

eg:1到100的累加

##!/bin/bash

s=0
for (( i=1;i<=100;i=i+1))
    do
        s=$(($s+$i))
    done

echo "sum is: $s"

4.例子9 批量添加删除指定数量的用户

#!/bin/bash

#批量添加指定数量的用户实例

read -t 30 -p "input user name:" name

read -t 30 -p "input password:" pass

read -t 30 -p "input user number:" num

#检查输入内容是否为非空

if [ -n "$name" -a -n "$pass" -a -n "$num" ]

        then

#检查输入的用户数量是否为纯数字 

        chknum=$( echo "$num" | sed 's/[0-9]//g' )

        if [ -z "$chknum" ]

                then

                        for (( i=1;i<="$num";i=i+1 ))

                                do

#添加用户

                                     /usr/sbin/useradd $name$i &>/dev/null

#添加用户密码,passwd 的--stdin参数是非交互输入,直接传入密码,不需要第二次确认

                                        echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null

                                        echo "add $i complete"

                                done

        else

                echo "the num must be number"

        fi

else

        echo "input can not be null,please input"

fi

批量删除用户实例
cat /etc/passwd | grep /bin/bash | grep -v /root | cut -d “:” -f 1 #找出/etc/passwd下的普通用户

#!/bin/bash

#批量删除用户

user=$(cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 1)

for i in $user

        do

#删除用户,-r参数是删除用户家目录

                /usr/sbin/userdel -r $i

        done

七、while循环和until循环
1.while循环

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。

while[ 条件判断式 ]

	    do

		        程序

	    done

2.例子10

#!/bin/bash

#从1加到100

i=1

s=0

while [ $i -le 100 ]

#如果变量i的值小于等于100,则执行循环

	    do 

		        s=$(( $s+$i ))

		        i=$(( $i+1 ))

	    done 

echo "The sum is:$s"

3.until循环
until循环和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序,一旦循环条件成立,则终止循环

格式:
until [ 条件判断式 ]
   do 
         程序
   done

4。例子11

#!/bin/bash
#until循环1加到100
sum=0
i=1
until [ $i -gt 100 ]
        do
                sum=$(( $sum+$i ))
                i=$(( $i+1 ))
        done
echo "The sum is: $sum"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值