欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > shell脚本的一些学习笔记----(三)流程控制

shell脚本的一些学习笔记----(三)流程控制

2025/2/22 2:16:39 来源:https://blog.csdn.net/cpsss0681/article/details/145571924  浏览:    关键词:shell脚本的一些学习笔记----(三)流程控制

1.条件判断

        if单条件判断

if [ 条件判断式 ]

        then

                语句块

fi

案例1:统计根分区使用率

[root@localhost ~]$ vi sh/if1.sh
#!/bin/bash

#把根分区使用率作为变量值赋予变量rate
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}’| cut -d "%"-f1)

#判断rate的值如果大于等于80,则执行then程序
if [ $rate -ge 80 ]
    then
        echo "Warning!!!"    #打印警告信息。
fi

案例解释:上面这个案例是用来统计/dev/sda1这个区域使用率的。

首先df -h能打印出如下信息

cps@ubuntu:~/test$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           796M  9.3M  787M   2% /run
/dev/sda1        39G  5.0G   32G  14% /
tmpfs           3.9G  188K  3.9G   1% /dev/shm

grep "/dev/sda1"可以在df -h打印出的信息中检索出含有 "/dev/sda1" 的那行内容A。

然后awk '{print $5}’可以利用awk工具将A行以空格为分割符来进行分割。这样就得到了6个数据:/dev/sda1、39G、5.0G、32G、14%、/,并且{print $5}可以打印出第5列的内容,即14%这个内容。

通过管道符继续下一层过滤,cut -d "%"-f1。cut工具选项-d就是以xx作为分割符,这里分割符是%这个字符,分割下来后,再通过-f1来选择分割出的第一个数据:14。这样就实现了去除%的一个作用

案例2:创建目录

[root@localhost ~]$ vi sh/add_dir.sh
#!/bin/bash


#创建目录,判断是否存在,存在就结束,反之创建
echo "当前脚本名称为$0"
DIR="/media/cdrom"


if [ ! -e $DIR ]
then
    mkdir -p $DIR
fi
echo "$DIR 创建成功"

上面这个案例是判断目录是否存在,若不存在就创建一个目录。其中if [ ! -e $DIR ]的-e就是判断是否存在的文件判断符。

mkdir -p中的-p可以创建一个完全不存在的路径,并且把路径包含的目录(不存在的目录)都创建出来。

        if双条件判断

if [ 条件判断式 ]

        then

                语句块1

        else

                语句块2

fi

和C一样,不写案例了。

        if多条件判断

if [ 条件判断式1 ]

        then

                 当条件判断式1成立时,执行程序1

elif [ 条件判断式2 ]

        then

                当条件判断式2成立时,执行程序2

elif [ 条件判断式3 ]

        then

                当条件判断式3成立时,执行程序3 …

...

else

        当所有条件都不成立时,最后执行此程序

fi

和python差不多

案例1:判断用户输入的是什么文件

[root@localhost ~]$ vi sh/if-elif.sh
#!/bin/bash
#判断用户输入的是什么文件

read -p "Please input a filename: " file
#接收键盘的输入,并赋予变量file


if [ -z "$file” ]
#判断file变量是否为空
    then
        echo "Error, please input a filename"
        #如果为空,执行程序1,也就是输出报错信息
        exit 1
        #退出程序,并返回值为Ⅰ(把返回值赋予变量$P)
elif [ ! -e "$file” ]
        #判断file的值是否存在
        then
        echo "Your input is not a file!"
        #如1果不存在,则执行程序2
        exit 2
        #退出程序,把并定义返回值为2
elif [ -f "$file” ]
        #判断file的值是否为普通文件
        then
        echo "$file is a regulare file!”
        #如果是普通文件,则执行程序3
elif [ -d "$file” ]
        #到断file的值是否为目录文件
        then
        echo "$file is a directory!"
        #如果是目录文件,网执行程序4
else
    echo "$file is an other file!”
    #如果以上判断都不是,则执行程序5
fi

2.多分支选择判断:case

case $变量名 in

        "值1")

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

         ;;

         "值2")

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

         ;;

         *)

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

         ;;

esac

案例1:判断输入的字符

#!/bin/bash

read -p "请输入一个字符,并按下enter:" KEY

case "$KEY" in
        [a-z] | [A-Z])
                echo "输入的是字母!"
        ;;

        [0-9])
                echo "输入的是数字!"
        ;;

        *)
                echo "输入内容不是数字也不是字母!"
        ;;
esac

案例解释,这是一个用户输入字符,脚本判断字符种类的一个应用。这里的判断条件出现了[0-9]、[a-z]这类的范围判断,这个[  ]内代表着一个范围,其中任何一个在这个范围内的字符都满足[0-9],而且这里有个注意事项,即[  ]的内部不能出现空格,必须连续的0-9,包括0-9前后也不能出现空格。

3.for循环

语法1:

for 变量名 in 值1 值2 值3 值4....(也可以放一个文件)

        do

                语句块

        done

这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。 也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。

语法2:

for ((语句1;语句2;语句3))

        do

                语句块

        done

这个语法跟C中的for用法一样。语句1一般是赋值,例如i=1。语句2是判断,结束循环的条件。语句3是i的一个变化,例如i++啊i=i+2啊。然后执行顺序就是:语句1-语句2-语句块-语句3-语句2 - 语句块-语句3-语句2 语句块-语句3-语句2.....

案例1:批量打印时间

案例2:批量压缩打包文件到各自指定文件夹内

循环的语句块中干了几件事:

1、dir变量赋值为.../test文件夹内的ls命令中的每个xxx.sh文件通过cut命令把 ‘.’ 当成分割符来切分并取值第一位切割下的字符串,例如ls后第一个是cal.sh,则dir就为cal。

2、创建一个名为变量dir的目录

3、压缩文件

4、移动文件到创建的目录

5、6、计算这是第几个文件并打印出来地址

4.while循环

while [条件判断]

        do

                语句块

        done

案例1:从1到10的阶乘

计算1-10的阶乘采用了while的循环,结束条件是[ $i -le 10 ],就是i小于等于10。

这里要注意条件判断[  ]内每个字符之间都要用空格隔开

案例2:猜价格数字游戏

值得注意的是 let TIMES++可以直接自加变量的值。而不需要写TIMES=&(expr $TIMES + 1),以及可以使用exit 0来退出循环(类似break)

5.until循环

和while相同的语法,只不过until循环的条件判断是不成立就执行,while是成立才执行。刚好反过来。

例如while true是执行循环,而until false是执行循环。

6.函数

function  函数名(){

        程序

}

案例1:用户输入一个数字,利用函数计算出从1加到该数的结果

这个案例中有个sed处理命令,这里用到了正则表达式和替换的功能。核心原理是利用sed将输入的字符串中的数字项去除,看看剩余的字符是否为空,如果是空,代表输入的都是数字,则可以判断输入的是数字而不是其他内容。

s/代表替换,g代表全局搜索。‘s/搜索内容/替换内容/g’就是全局下搜索内容并替换。

7.特殊流程控制

exit流程

exit可以退出shell,并且如果后面加了数字的话可以返回那个数字,例如上面这个案例中,如果输入的字符是数字,就会返回1,输入的是其他字符就会返回0

这个返回值可以执行完shell脚本后通过命令行输入$?来查看。这样就可以shell之间传递信息了。例如两个shell:A.sh和B.sh,A.sh里执行B.sh,并且可以通过B.sh的执行返回值来决定要干什么事情,比如B.sh中是否正确完整的执行了,如果执行成功就返回1,A.sh只有收到B.sh的1才会往下执行,不然就会终止。这样便可以做到多任务多模块间协调运行了。

break语句和continue语句

这两个跟C语言一样,其中break是退出整个循环,continue是退出这一次循环,本质上还在循环内。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词