一、脚本编程控制结构
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