练习1.
写一个脚本,通过ping 命令测试192.168.0.100到192.168.0.254之间的所有主机是否在线,
如果在线,就显示“ip is up.”IP为真实IP地址,且以绿色显示;
如果不在线,就显示“IP is down." ,以红色显示
要求:分别使用while, until 和for循环实现。
1.for循环 #/bin/bash # for i in {1..100};do if ping 192.168.3.$i -c1 -w1 > /dev/null;then echo -e "\033[32m192.168.3.$i IP is up\033[0m" else echo -e "\033[31m192.168.3.$i IP is down!\033[0m" fi done 2.while 循环 #/bin/bash # i=0 while [ $i -le 100 ];do if ping -c1 -w1 192.168.3.$i &> /dev/null;then echo -e "\033[32m192.168.3.$i IP is up.\033[0m" else echo -e "\033[31m192.168.3.$i IP is down.\033[0m" fi ((i++)) done 注:ping -c1 一次 -w1 延迟一秒 颜色: echo -e "\033[35mHello\033[0m,world."
练习2.
写一个脚本(前提:请为虚拟机新增一块硬盘,假设它为/dev/sdb),为指定的硬盘创建分区:
1.列出当前系统上所有的磁盘,让用户选择,如选择quit 则退出脚本:如果用户选择错误,就让用户重新选择;
2.当用户选择后,提醒用户确认接下来的操作可能会损坏数据,并请用户确认;如果用户选择y就继续,否则,让用户重新选择;
3.抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒钟后再分区):并为其创建三个主分区,第一个为20M,第二个为512M,第三个为123M,且第三个为swap分区类型;(将分区命令通过echo传送给fdisk即可实现)
1 脚本分析: 2 3 1.删除分区: dd if=/dev/zero of=/dev/hda bs=512 count=1 4 5 dd 用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换 6 7 if= :输入文件名 8 9 of=: 输出文件名 10 11 bs : 指定读入/输出的块大小,字节 12 13 count:#块个数 14 15 用空字节覆盖MAR引导,既删除分区整个硬盘分区 16 17 将U盘当前状态保存下来成为一个文件。 18 dd if=/dev/sdb of=/backup/ISO/Upan/save.iso 19 20 cat /dev/cdrom > xx.iso 21 22 mkisofs -r -o xx.iso /dev/cdrom 23 24 2.取出硬盘列表: 25 26 fdisk -l 2> /dev/null |grep "Disk /dev/[sh]d[a-z]" | awk -F: '{print $1}' 27 28 3.脚本创建分区 29 30 echo 'n 31 32 n 33 34 p 35 36 1 37 38 39 40 +20M 41 42 w' | fdisk /dev/hda 43 44 45 46 47 [root@localhost test]# cat disk.sh 48 #!/bin/bash 49 # 50 echo "Initial a disk..." 51 echo -e "\033[31mWarning:\033[0m" 52 fdisk -l 2> /dev/null |grep -o "^Disk /dev/[sh]d[a-z]" 53 54 read -p "Your choice:" PARTDISK 55 56 if [ $PARTDISK == 'quit' ];then 57 echo "quit" 58 exit 7 59 fi 60 61 until fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK$" &> /dev/null;do 62 read -p "Wrong option,Yourchoice aging:" PARTDISK 63 done 64 65 read -p "Will destroy all data, continue:y|n? " CHOICE 66 67 until [ $CHOICE == 'y' -o $CHOICE == 'n' ];do 68 read -p "Will destroy all data,continue:y|n? " CHOICE 69 done 70 if [ $CHOICE == 'n' ];then 71 echo "quit" 72 exit 9 73 else 74 dd if=/dev/zero of=$PARTDISK bs=512 count=1 75 sync 76 sleep 3 77 echo 'n 78 p 79 1 80 81 +20M 82 n 83 p 84 2 85 86 +512M 87 n 88 p 89 3 90 91 +128M 92 t 93 3 94 82 95 w' | fdisk $PARTDISK &> /dev/null 96 97 partprobe $PARTDISK 98 sync 99 sleep 3 100 mkfs.ext4 ${PARTDISK}1 101 mkfs.ext4 ${PARTDISK}2 102 mkswap ${PARTDISK}3 103 fi 104 105 106 107 108 扩展:删除分区先检测是否已挂载 109 110 #!/bin/bash 111 # 112 for I in `mount | grep "/dev/sdb" | awk '{print $1}'`;do 113 fuser -km $I #fuser -km /dev/sda1 #杀死所有使用sda1的进程 114 umount $I 115 echo "$I umonut OK." 116 done 117
脚本分析:
1.删除分区: dd if=/dev/zero of=/dev/hda bs=512 count=1
dd 用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换
if= :输入文件名
of=: 输出文件名
bs : 指定读入/输出的块大小,字节
count:#块个数
用空字节覆盖MAR引导,既删除分区整个硬盘分区
将U盘当前状态保存下来成为一个文件。
dd if=/dev/sdb of=/backup/ISO/Upan/save.iso
cat /dev/cdrom > xx.iso
mkisofs -r -o xx.iso /dev/cdrom
2.取出硬盘列表:
fdisk -l 2> /dev/null |grep "Disk /dev/[sh]d[a-z]" | awk -F: '{print $1}'
3.脚本创建分区
echo 'n
n
p
1
+20M