脚本编程控制结构之until
循环
for
while
until
while CONDITION; do
statement
done
进入循环:条件满足
退出循环:条件不满足
until CONDITION; do
statement
...
done
进入循环:条件不满足
退出循环:条件满足
vim quit.sh
#!/bin/bash
read -p "Input something:" STRING
while [ $STRING != 'quit' ]; do
echo $STRING | tr 'a-z' 'A-Z'
read -p "Again Input something:" STRING
done
chmod +x quit.sh
./quit.sh
bash -x quit.sh (查看脚本进展过程)
vim until.sh
#!/bin/bash
#
read -p "Input something:" STRING (输入字符保存在STRING当中)
until [ $STRING == 'quit' ]; do
echo $STRING | tr 'a-z' 'A-Z'
read -p "Input something:" STRING
done
chmod +x until.sh
./until.sh
每隔5秒钟查看hadoop是否登录
vim hadoop.sh
#!/bin/bash
#
who | grep "hadoop" &> /dev/null
RETVAL = $? ($? 上一个命令的结果 0 为执行正确)
until [ $RETVAL -eq 0 ]; do
echo "hadoop is not come."
sleep 5
who | grep "hadoop" &> dev/null
RETVAL = $?
done
echo "hadoop is logged in."
chmod +x hadoop.sh
修正版:
vim hadoop.sh
#!/bin/bash
#
until who | grep "hadoop" &> /dev/null; do
echo "hadoop is not come."
sleep 5
done
echo "hadoop is logged in."
chmod +x hadoop.sh
for 循环
for 变量 in 列表;do
循环体
done
for ((expr1;expr2;expr3));do
循环体
done
近似C语言的风格
计算1-100以内所有正整数的和
#!/bin/bash
#
declare -i SUM = 0
for I in {1..100}; do
let SUM+=$I
done
echo $SUM
换一种写法
#!/bin/bash
#
declare -i SUM=0
for ((I =1;I <=100;I++));do
let SUM+=$I
done
echo $SUM
for((I=2;I<=100;I+=2));do
100以内所有偶数的和
for((I=1;I<=100;I+=2));do
100以内所有奇数的和
***通过ping命令,测试192.168.0.151到192.168.0.254之间的所有主机是否在线,
如果在线,就显示“ip is up”,其中IP要换位真正的IP地址,且以绿色显示;
如果不在线,就显示“ip is down”,其中IP要换位真正的IP地址,且以红色显示。
要求:分别用while ,until ,for 循环实现
ping命令的使用:ping 192.168.0.254
ping -c 1 192.168.0.254
-c表示ping的次数,否则会一直ping下去
echo $?
ping -W
-W选项: timeout Time to wait for a response, in seconds.
ping -c 1 -W 1 192.168.0.245
ping -c 1 -W 1 192.168.0.245 &> /dev/null
awk
awk:报告生成工具,当cut
完成不了任务时使用awk
,也是一个文本处理工具
一次从中读一行,每读一行按照指定的分隔符在内部切开,切开后给切开的每一段一个标识符。将处理后的结果显示出来。
df -Ph
awk 'PATTERN{ACTION}' file 默认分隔符是[space]
PATTERN表示过滤,指出处理哪些符合条件的行;
ACTION:
print $1 显示第一段
df -Ph | awk '{print $1}'
显示第一段
df -Ph | awk '{print $2}'
显示第二段
df -Ph | awk '{print $1,$2}'
显示第一段和第二段,之间用,隔开
df -Ph | awk '{print $0}'
显示所有字段
df -Ph | awk '{print $NF}'
NF number of field 字段个数,显示最后一段
awk -F: '{print 3}' /etc/passwd 分隔符为“:”
fdisk -l 2> /dev/null 将错误信息给到/dev/null
fdisk -l 2> /dev/null | grep "^Disk /dev/[sh]d[a-z]"
以Disk开头,s或h开头后面跟d, a-z中任意一个字符
结果:Disk /dev/sda: 128.8GB, 128849018880 bytes
fdisk -l 2> /dev/null | grep "^Disk /dev/[sh]d[a-z]" | awk -F: '{print $1}'
结果:Disk /dev/sad
关机命令:shutdown -h now
R: the system is going down for system halt NOW!
添加虚拟磁盘:
***抹除那块硬盘上的所有分区(提示,抹除所有分区后执行sync命令,并让脚本睡眠3秒后再分区);并为其创建三个主分区,第一个为20M,第二个为512M,第三个为128M,且第三个为swap分区类型,(提示:将分区命令通过echo传送给fdisk即可实现)
删除所有分区
dd if=/dev/zero of=/dev/sdb bs=512 count=1
把所有操作同步内存与硬盘
sync
sleep 3
fdisk -l | grep "^Disk /dev/[sh]d[a-z]"
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}'
vim setpart.sh
#!/bin/bash
#
echo 'n ###new 一个分区
p ###主分区还是扩展分区
1 ###第几个编号
+20M
n
p
2
+512M
n
p
3
+128M
t ###调整哪个分区
3 ###第三个
82 ###类型为82
w' | fdisk /dev/hda
:wq
sync
fdisk -l
网友评论