回顾
脚本编程控制结构:
顺序
选择
if
case
循环
for
while
until
#条件满足进入循环;条件不满足退出循环
while CONDITION; do
statement
...
done
until循环
#和while相反;条件不满足进入循环;条件满足退出循环
until CONDITION; do
statement
...
done
练习和while对比
#!/bin/bash
#showdisk.sh
#while版本
cat <<EOF
D|d)show disk usages;
M|m)show memory usages;
S|s)show Swap usages;
*)quit
EOF
read -p "Your choice:" CHOICE
while [ $CHOICE != 'quit' ]; do
case $CHOICE in
D | d)
echo "Disk usage:"
df -Ph ;;
M | m)
echo "Memory usages:"
free -m | grep -B 1 Mem ;;
S | s)
echo "Swap usage:"
free -m | grep -B 1 Swap;;
*)
echo "Unknown."
esac
read -p "Again,your choice:" CHOICE
done
#!/bin/bash
#showdisk.sh
#until版本
cat <<EOF
D|d)show disk usages;
M|m)show memory usages;
S|s)show Swap usages;
*)quit
EOF
read -p "Your choice:" CHOICE
until [ $CHOICE = 'quit' ]; do
case $CHOICE in
D | d)
echo "Disk usage:"
df -Ph ;;
M | m)
echo "Memory usages:"
free -m | grep -B 1 Mem ;;
S | s)
echo "Swap usage:"
free -m | grep -B 1 Swap;;
*)
echo "Unknown."
esac
read -p "Again,your choice:" CHOICE
done
c形式的for循环
for (( expr1 ; expr2 ; expr3 )); do
statement
...
done
#expr1:指定初始条件
#expr2:判断什么时候退出
#expr3:修正变量值
#以前
declare -i SUM=0
for I in {1..100}; do
let SUM+=$I
echo $SUM
done
#现在
declare -i SUM=0
for ((I=1;I<=100;I++)); do
let SUM+=$I
done
echo $SUM
练习
写一个脚本,使用ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线;如果在线就显示:“ip:xxx.xxx.xxx.xxx is up”,以绿色显示;如果不在线就显示:“ip:xxx.xxx.xxx.xxx is down”,以红色显示。要求:分别使用while,until,for(两种)实现。
ping -c 10 xxx.xxx.xxx.xxx #ping 10次后结束
-W #指定连接超时
awk命令基础
awk 'PATTERN{ACTION}' file
ACTION:print
变量:$1,$2,...; $NF:最后一个字段
指定分隔符:-F: 默认为空格
eg:df -Ph | awk '{print $1,$3}' #打印df命令执行结果的第一列和第三列
eg:awk -F: '{print $1,$3}' /etc/passwd
fdisk -l 2> /dev/null | grep "^Disk /dev/[sh]d[a-z]" #找出硬盘非分区
fdisk -l 2> /dev/null | grep "^Disk /dev/[sh]d[a-z]" | awk -F: '{print $1}' #取出设备名"Disk /dev/sda"
练习
脚本创建分区
#!/bin/bash
#
echo 'n
p
1
+20M
N
P
2
+512M
N
P
3
+128M
t
3
82
w ' | fdisk /dev/hda
练习(自动分区格式化)
写一个脚本,要求:
1,列出系统上所有磁盘,让用户选择,quit则退出脚本;如果选择错误就重新选择;
2,当用户选择后提醒用户接下来的操作可能会损坏数据,并请用户确认;y就继续,n就退出;否则重新选择;
3,抹除该硬盘所有分区(提示:抹除后执行sync命令,并让脚本睡眠3秒后再分区),并为其创建三个主分区,第一个20M,第二个512M,第三个128M,且第三个为swap类型的分区。
#!/bin/bash
#partdisk.sh
#!/bin/bash
#partdisk.sh
echo "Initializing a disk..."
echo -e "\033[31mWarning: \033[0m"
fdisk -l 2> /dev/null | grep -o "^Disk /dev/[sh]d[a-z]"
read -p "Your choice:" PARTDISK
if [ $PARTDISK == 'quit' ]; then
echo "quit"
exit 7
fi
until fdisk -l 2> /dev/null | grep "^Disk /dev/[sh]d[a-z]" | grep "^Disk $PARTDISK$" &> /dev/null; do
read -p "Wrong option,Your choice again:" PARTDISK
done
read -p "Will destroy all data,continue:" CHOICE
until [ $CHOICE == 'y' -o $CHOICE == 'n' ]; do
read -p "Will destroy all data,continue:" CHOICE
done
if [ $CHOICE == 'n' ]; then
echo "Quit."
exit 9
else
for I in `mount | grep "^$PARTDISK$ | awk '{print $1}'"`; do
fuser -km $I
umount $I
echo "$I umount ok."
done
dd if=/dev/zero of=$PARTDISK bs=512 count=1
sync
sleep 3
echo "Partition."
echo 'n
p
1
+20M
N
P
2
+512M
N
P
3
+128M
t
3
82
w ' | fdisk $PARTDISK &> /dev/null
partprob $PARTDISK
sync
sleep 2
mke2fs -j ${PARTDISK}1 &>/dev/null
mke2fs -j ${PARTDISK}2 &>/dev/null
mkswap ${PARTDISK}3
fi