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的整数的和
脚本内容:
脚本执行结果:
·for循环的另一种格式(类似于我们C语言中的for循环)
语法格式:
for ((给循环控制变量一个初始值;再给它一个退出值;修正循环控制变量));do
循环体
done
练习:写一个脚本,要求
使用for循环的另一种格式来计算1-100中所有偶数的和
脚本内容:
脚本执行结果:
·ping命令
ping命令的-c #选项可以指定ping的次数,默认一直ping下去
ping命令的-W #(单位为秒钟)选项可以指定超时时长,当我们ping一台主机的时候,如果该主机不在线,那么它的响应时间会变得很长,此时我们就可以指定它的等待时长
当我们ping通一台主机的时候,ping命令的执行状态返回值为0,反之则为1
·awk命令
awk是一个报告生成工具,也是一个文本处理工具,它的优势在于,和cut命令不一样的,我们在使用awk命令切割字段的时候,可以忽略字段间分隔符的个数,awk和sed一样,在处理文本的时候,都是一次读取文本的一行内容,然后将该行内容在内部按照用户所指定的分隔符进行切割,不过用户指定的分隔符必须是输入分隔符,意思是指定的分隔符必须是该行内容中原有的分隔符,我们就是按照这样的分隔符进行字段切割的,awk命令默认的输出分隔符都是空格,切割完字段之后,awk会给每一个被切割出来的字段一个标识符,第一个字段为$1,第二个字段为$2,...依次类推,之后再去处理下一行内容。
awk命令使用的基本语法格式:
awk -F(输入分隔符)->指定输入分隔符 ‘Pattern{Action}‘ filename
Pattern是模式匹配的模式,表示只处理符合匹配条件的行,如果条件符合了,那么就Action就表示在符合条件的那些行上做出处理动作,要想显示多个不同字段的话,直接在多个不同字段对应的标识符之间加上逗号即可,最简单的Action(处理动作)是print(打印)
温故:[abcd...]:中括号表示文件名通配中的,实现匹配指定范围内的单个字符
2>表示的是IO重定向中的重定向错误输出
&>表示的是IO重定向中的重定向所有输出(包括正确的和错误的)
练习:写一个脚本,为指定的磁盘创建分区并格式化
要求
1,列出当前系统上的所有磁盘,让用户选择,并且支持q退出脚本,如果用户选择错误,则让用户重新选择;
2,当用户选择后,提醒用户接下来的操作可能会损坏数据,并请用户确认操作,如果用户选择y则开始分区格式化,如果用户选择n就退出脚本,否则就让用户重新选择;
3,抹除指定磁盘上的所有分区,并为其创建三个主分区,第一个分区为20M,第二个分区为512M,第三个分区为128M,且第三个分区为swap类型
脚本内容:
脚本执行结果:
·总结上述脚本:
->抹除所有分区的命令是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选项则是只将匹配到的字符串输出至显示器