首页 > 代码库 > Linux01-脚本编程之八until循环及脚本完成磁盘分区格式化37

Linux01-脚本编程之八until循环及脚本完成磁盘分区格式化37


一、脚本编程控制结构

   1、顺序

   2、选择

       if

       case

   3、循环

       a)for

       b)while CONDITION;do

           statment

...

         done

进入循环:条件满足

       退出循环:条件不满足

       c)until

二、until循环

   1、格式:

       until CONDITION; do

           statement

           ...

       done

   2、表示:

进入循环:条件不满足

       退出循环:条件满足

   如:写脚本,每5s检查一次hadoop是否登录系统;

#!/bin/bash

#

who | grep "hadoop" >> /dev/null

RESULT=$?

until [ $RESULT -eq 0 ];do

echo "Hadoop is not login."

sleep 5

who | grep "hadoop" >> /dev/null

       RESULT=$?

done

echo "Hadoop is logged in."

三、for循环

   1、第一种格式:

       for 变量 in 列表; do

           循环体

       done

   2、第二种格式:

       a)语法(类似c语言):

           for (( expr1 ; expr2 ; expr3 )); do

               循环体

           done

       b)表示:

           expr1表示初始值;expr2判断语句;expr3修正expr1的值;

       如1:写脚本,计算100以内正整数的和;

#!/bin/bash

#

declare -i SUM=0

for ((I=1;I<=100;I++));do

       SUM=$SUM+$I

done

       echo "$SUM"

       如2:写脚本,计算100以内偶数的和;

#!/bin/bash

#

declare -i SUM=0

for ((I=2;I<=100;I+=2));do

       SUM=$SUM+$I

done

       echo "$SUM"

四、awk基本用法

   1、awk:报告生成工具,自动把每行的内容按照指定的分隔符切割,并给每段一个变量表示;

   2、基本命令格式:awk ‘PATTERN{ACTION}‘ file

   如1:df -Ph | awk ‘{print $1}‘

       用df -Ph | cut -d ‘ ‘ -f1(对比2命令的不同)

       df -Ph | awk ‘{print $1,$3}‘

       df -Ph | awk ‘{print $0}‘

       df -Ph | awk ‘{print $NF}‘

   如2:awk -F: ‘{print $1,$3}‘ /etc/passwd

   如3:fdisk -l 2> /dev/null | grep "^Disk /dev/[sh]d[a-z]" | awk -F: ‘{print $1}‘

练习1,写一个脚本:

1、通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线,

如果在线,就显示"ip is up.",其中的IP要换为真正的IP地址,且以绿色显示;

如果不在线,就显示"ip is down.",其中的IP要换为真正的IP地址,且以红色显示;

要求:分别使用while,until和for(两种形式)循环实现。

参考答案:

#!/bin/bash

#

IP=192.8.8

for I in `seq 10 40`;do

       ping -c 1 -w 1 $IP.$I &> /dev/null && echo -e "\033[32m$IP.$I is up.\033[0m" || echo -e "\033[31m$IP.$I id down.\033[0m"

done


练习2,写一个脚本(前提:请为虚拟机新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区:

1、列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本;如果用户选择错误,就让用户重新选择;

2、当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认;如果用户选择y就继续,n就退出;否则,让用户重新选择;

3、抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后再分区);并为其创建三个主分区,第一个为20M,第二个为512M, 第三个为128M,且第三个为swap分区类型;

(提示:将分区命令通过echo传送给fdisk即可实现)

删除所有分区:dd if=/dev/zero of=/dev/sdb bs=512 count=1

同步操作到硬盘:sync

partprobe

sleep 3

参考答案:

#!/bin/bash

#

echo -e "\033[32mInitialize disk...\033[0m"

fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | awk -F: ‘{print $1}‘

read -p  "Your choice disk device:" PARTDISK

while [ $PARTDISK == ‘quit‘ ];do

       echo "Quit"

       exit 2

done

until fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK$" &> /dev/null;do

       read -p "Wrong option,Your choice again:" PARTDISK

done

while [ $PARTDISK == ‘quit‘ ];do

       echo "Quit"

       exit 3

done

read -p "Waring,Will destory all data,continue(Y/N):" CHOICE


until [ $CHOICE == ‘y‘ -o $CHOICE == ‘n‘ ];do

       read -p "Waring,Will destory all data,continue(Y/N):" CHOICE

done


if [ $CHOICE == ‘n‘ ];then

       echo "Quit."

       exit 7

else


for I in `mount | grep "$PARTDISK" | awk ‘{print $1}‘`;do

       fuser -km $I

       umount $I

       echo -e "\033[32m$I unmount ok.\033[0m"

done


dd if=/dev/zero of=$PARTDISK bs=512 count=1 &> /dev/null

sync

sleep 3

echo ‘n

p

1


+20M

n

p

2


+512M

n

p

3


+128M

t

3

82

w‘ | fdisk $PARTDISK &> /dev/null

partprobe $PARTDISK

sync

sleep 2

mke2fs -j ${PARTDISK}1 &> /dev/null

mke2fs -j ${PARTDISK}2 &> /dev/null

mkswap ${PARTDISK}3 &> /dev/null

fi

echo "Formatting is finish."    。


本文出自 “Nick Liu的博文” 博客,请务必保留此出处http://zkhylt.blog.51cto.com/3638719/1408924