Shell脚本实现磁盘分区格式化

    我们的Shell脚本程序结构分为,顺序结构,选择结构以及循环结构,我们之前已经介绍过选择结构包括if、case语句,循环结构包括for循环、while循环以及until循环,今天我们就来介绍一下until循环,until循环的语法格式如下:

                until condition;do

                    循环体

                done

    由以上可以看出,我们的until循环的语法格式和我们的while循环是一样的,唯一不同的是我们的while循环是在满足condition的情况下进入循环体进行循环,而我们的until是在满足condition的情况下终止循环,这和我们的while循环的机制刚好相反,until后面可以直接接上我们的Linux命令,表示的是将命令看做是是否跳出循环的条件,until判断的是命令的执行状态返回值,任何时候我们想要引用命令的执行状态返回值的时候,都可以直接将命令写在程序关键字的后面即可。

    练习:写一个脚本,要求

        使用until循环,来计算1到100的整数的和

        脚本内容:

        wKioL1epmOLzdrXHAAAr4mEgEbc969.png

        脚本执行结果:

        wKioL1epmOyiIdVSAAANnd5wEeY538.png

    

·for循环的另一种格式(类似于我们C语言中的for循环)

    语法格式:

        for ((给循环控制变量一个初始值;再给它一个退出值;修正循环控制变量));do

                循环体

        done

    练习:写一个脚本,要求

        使用for循环的另一种格式来计算1-100中所有偶数的和

        脚本内容:

        wKiom1epmczRWU1wAAAnHhXvUaM852.png

        脚本执行结果:

        wKioL1epmdaw9_k-AAAN9IDhUvE307.png


·ping命令

    ping命令的-c #选项可以指定ping的次数,默认一直ping下去

    wKiom1epmlyDjgFzAABxbkeuRK4456.png

    ping命令的-W #(单位为秒钟)选项可以指定超时时长,当我们ping一台主机的时候,如果该主机不在线,那么它的响应时间会变得很长,此时我们就可以指定它的等待时长

    wKiom1epmxKhe3FDAABFIhO_lLU887.png

    当我们ping通一台主机的时候,ping命令的执行状态返回值为0,反之则为1

    wKioL1epm1mC_GZeAACRqs1oR9Y951.png


·awk命令

    awk是一个报告生成工具,也是一个文本处理工具,它的优势在于,和cut命令不一样的,我们在使用awk命令切割字段的时候,可以忽略字段间分隔符的个数,awk和sed一样,在处理文本的时候,都是一次读取文本的一行内容,然后将该行内容在内部按照用户所指定的分隔符进行切割,不过用户指定的分隔符必须是输入分隔符,意思是指定的分隔符必须是该行内容中原有的分隔符,我们就是按照这样的分隔符进行字段切割的,awk命令默认的输出分隔符都是空格,切割完字段之后,awk会给每一个被切割出来的字段一个标识符,第一个字段为$1,第二个字段为$2,...依次类推,之后再去处理下一行内容。

    awk命令使用的基本语法格式:

        awk -F(输入分隔符)->指定输入分隔符 'Pattern{Action}' filename

            Pattern是模式匹配的模式,表示只处理符合匹配条件的行,如果条件符合了,那么就Action就表示在符合条件的那些行上做出处理动作,要想显示多个不同字段的话,直接在多个不同字段对应的标识符之间加上逗号即可,最简单的Action(处理动作)是print(打印)

          wKioL1epoZLieIy-AAA_k1pKLvI566.png

           wKiom1epobeiPm5kAABZfewe0qE670.png

    温故:[abcd...]:中括号表示文件名通配中的,实现匹配指定范围内的单个字符

          wKiom1epn5TiHSS6AAAOA9kEEmw642.png

          2>表示的是IO重定向中的重定向错误输出

          wKiom1epoGzxVoggAAAkqianQuE543.png

          &>表示的是IO重定向中的重定向所有输出(包括正确的和错误的)

          wKioL1epoO7S7tJWAABE_cRk8tU745.png


    练习:写一个脚本,为指定的磁盘创建分区并格式化

        要求

        1,列出当前系统上的所有磁盘,让用户选择,并且支持q退出脚本,如果用户选择错误,则让用户重新选择;

        2,当用户选择后,提醒用户接下来的操作可能会损坏数据,并请用户确认操作,如果用户选择y则开始分区格式化,如果用户选择n就退出脚本,否则就让用户重新选择;

        3,抹除指定磁盘上的所有分区,并为其创建三个主分区,第一个分区为20M,第二个分区为512M,第三个分区为128M,且第三个分区为swap类型

        脚本内容:

        wKiom1eprazBILbmAAEBBbJP7bk996.png

wKioL1eprciD9SlWAACBh94xqDo362.png

wKioL1epreTDOb9kAABQ0YptD9o802.png

        脚本执行结果:

        wKioL1epre-iy43lAABrVxIHj2I729.png

·总结上述脚本:

    ->抹除所有分区的命令是dd if=/dev/zero of=/dev/sd# bs=512 count=1,覆盖掉了一个磁盘上最前面的512个字节的数据,而这部分的数据正是我们的MBR,MBR损坏之后,就相当于是抹除了所有分区

   ->sync命令表示将内存上的操作同步到磁盘上去,因为我们上面抹除MBR的命令执行速度过快,为了防止系统来不及将内存中的改动同步到我们的硬盘中,我们得手动同步一次,并且用sleep 3命令使得脚本等待3秒,让我们的系统能够识别我们的命令

    -> read命令是在等待我们的用户输入内容之后才继续向下执行的

    ->我们使用脚本来进行磁盘分区的时候,可以直接使用echo命令,将我们要执行的操作传递给fdisk /dev/sd#命令即可


温故:1,fuser -km 命令,是用来将所有正在使用挂载点的进程全部踢掉的命令

      2,我们的grep命令,默认是将匹配到的那一行内容全部输出至显示器

         而grep -o选项则是只将匹配到的字符串输出至显示器