Shell编程之条件判断和流程控制

流程控制语句

条件式判断语句

1 按照文件类型进行判断

测试选项作用
-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空(非空为真)
-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

两种判断格式

// 版本1
test -e  /root/install.log

// 版本2 ,推荐使用
[ -e /root/install.log ]

// eg:
[ -d /root ] && echo yes || echo no

2 安装文件权限进行判断

测试选项作用
-r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

3 两个文件之间进行比较

测试选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2判断文件1是否和文件2的Inode号一致,可以临街为两个文件是否为同一个文件。这个判断可以用于判断两个文件是否为硬链接
// 判断硬链接
$ ln fork.c /tmp/fork.c

// 查看fork.c 的i节点
$ ll -i /tmp/fork.c 
840026 -rw-rw-r-- 2 test test 658 531 21:10 /tmp/fork.c

$ ll -i fork.c
840026 -rw-rw-r-- 2 test test 658 531 21:10 fork.c

$ [ fork.c -ef /tmp/fork.c ] && echo yes || echo no
yes

4 两个整数之间比较

测试选项作用
整数1 -eq 整数2判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2判断整数1是否小于等于整数2(小于等于为真)

注:在shell编程当中所有的内容都是字符串,这里因为有明确的数值比较参数,所以shell可以自动转换为数值再进行比较

5 字符串的判断

测试选项作用
-z 字符串判断字符串是否为空(为空返回真)
-n 字符串判断字符串是否为非空(非空返回真)
字符串1 == 字符串2判断字符串1是否和字符串2相等(相等返回真)
字符串1 != 字符串2判断字符串1是否和字符串2不相等(不相等返回真)

注1:使用变量进行字符串判断时,必须使用"$variable",不能使用 $variable

注2:字符串相等比较中可以使用一个等号来进行字符串相等判断,但因为shell中变量赋值也是一个等号,为了避免歧义和错误使用两个等号最好。

// 做字符串判断
$ aa=11
$ bb=22
$ [ -z "$aa" ] && echo yes || echo no
no
// 做数值判断
$ [ $aa -eq $bb ] && echo yes || echo no
no

6 多重条件判断

测试选项作用
判断1 -a 判断2逻辑与,判断1和判断2都成立,最终的结果才为真
判断1 -o 判断2逻辑或,判断1和判断2有一个成立,最终的结果就为真
!判断逻辑非,使原始的判断式取反
// 多条件判断
$ aa=11
$ bb=11
$ [ $aa -eq $bb -a $aa -gt 33 ] && echo yes || echo no
no

单分支if语句

if [ 条件判断式 ]; then
    程序
fi
// 或者
if [ 条件判断式 ]
    then
    程序
fi
// 例子1,判断当前用户是否为root
#!/bin/bash

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

if [ "$test" == "root" ]
    then 
        echo "Current user is root"
fi

// 例子2,判断/dev/sd3使用率
#!/bin/bash

rate=$(df -h | grep sda3 | awk '{print $5}' | cut -d"%" -f1)

if [ $rate -gt 80 ]
        then
                echo "Warning! /dev/sda3 is full!"
fi

双分支if语句

if [ 条件判断式 ]
    then
        条件成立时,执行的程序
    else
        条件不成立,执行另一个程序
fi
// 例子3,判断输入是否为目录
#!/bin/bash

read -p "Please input a dir: " dir 

if [ -d $dir ]
        then
                echo "$dir is directory"
        else 
                echo "$dir is not a directory"
fi

// 例子4,判断apached服务是否启动,未启动则启动
// 注:脚本名不能带有httpd字样否则test仍被脚本本身赋值
#!/bin/bash

test=$(ps aux | grep httpd | grep -v grep)

if [ -n "$test" ] # 这里必须是"$test"而不是$test
        then
                echo "$(date) httpd is OK!" >> /tmp/autostart-acc.log
        else
                /etc/rc.d/init.d/httpd start &> /dev/null
                echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi

多分支if语句

if [ 条件判断式 ]
    then
        条件1成立时,执行程序1
elif [ 条件判断式2 ]
    then
        条件2成立,执行程序2
...
else
    当所有条件都不成立时,执行此程序
fi
// 例子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  a operator: " ope 

if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
        then
        # 判断num1、num2为数字
        # 使用sed替换数字为空,如果num1为数字,则test1为空
        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 
                        sum=$(($num1+$num2))
                elif [ "$ope" == '-' ]
                        then
                        sum=$(($num1-$num2))
                elif [ "$ope" == '*' ]
                        then
                        sum=$(($num1*$num2))
                elif [ "$ope" == '/' ]
                        then
                        sum=$(($num1/$num2))
                else
                        echo "Please input a valid symbol!";
                        exit 10
                fi
        else
                echo "Please input a valid value!"
                exit 11
        fi
else
        echo "Please input contents!"
        exit 12
fi
echo "$num1 $ope $num2 = $sum"
// 例子6 判断用户输入的是什么文件
#!/bin/bash

read -p "Please input a filename: " file

if [ -z "$file" ]; then
        #$file variable is empty
        echo "Error,please input a filename!"
        exit 1
elif [ ! -e "$file" ]; then
        echo "Your imput is not file!"
        exit 2
elif [ -f "$file" ]; then
        echo "$file is a regulare file!"
elif [ -d "$file" ]; then
        echo "$file is a directory!"
else
        echo "$file is an other file!"
fi

case语句

case $变量名 in
    "值1")
        如果变量的值等于值1,则执行程序1
        ;;
    "值2")
        如果变量的值等于值2,则执行程序2
        ;;
    ...

    *)
        如果变量的值不等于以上的值,则执行此程序
        ;;
esac
// 例子7
#!/bin/bash

read -p "Please choose yes/no: " -t 30 cho 

case "$cho" in
        "yes")
                echo "Your choice is yes!" 
                ;;
        "no")
                echo "Your choice is no!"
                ;;
        *)
                echo "Please input correct content!"
                ;;
esac

for循环

for 变量 in123
    do
        程序
    done

for (( i=1; i<=100; i=i+1 ))
    do
        程序
    done
// 例子8,批量解压压缩文件
#!/bin/bash

cd /root/test/
ls *.tar.gz > ls.log
ls *.tgz >> ls.log

for i in $(cat ls.log)
        do
                tar -zxf $i & > /dev/null
        done

// 例子9,计算和
#!/bin/bash

s=0

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


// 例子10,批量添加用户
#!/bin/bash

read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num 
read -p "Please input the password of users: " -t 30 pass

if [ -z "$name" -a !-z "$num" -a !-z "$pass" ]; then
        y=$(echo $num|sed 's/[0-9]//g)
        if [ -z "$y" ]; then
                for ((i=1; i<=$num; i=i+1))
                        do
                                /usr/sbin/useradd $name$i &>/dev/null
                                echo $pass|usr/bin/passwd --stdin $name$i &>/dev/null
                        done
        fi
fi

while循环和until循环

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,知道条件判断式不成立,循环才会停止。

// 例子11,求和
#!/bin/bash

i=1
s=0

while [ $i -le 100 ]
    do
        s=$(($s+$i))
        i=$(($i+1))
    done
echo "The sum is $s"

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

// 例子12,求和
#!/bin/bash

i=1
s=0

until [ $i -gt 100 ]
    do
        s=$(($s+$i))
        i=$(($i+1))
    done
echo "The sum is $s"

参考

慕课网课程-Shell编程之条件判断和流程控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值