1.for循环
for 定义变量
do
使用变量,执行动作
done #结束标志
格式1:
#!/bin/bash
for WESTOS in `seq 1 2 10` #该格式无法倒序
do
echo $WESTOS
done
格式2:
for WESTOS in 1 2 3
do
echo $WESTOS
done
格式3:
for WESTOS in {10..1} #该格式可以倒序
do
echo $WESTOS
done
格式4:
for ((WESTOS=0;WESTOS<10;WESTOS++)) #(())为固定格式
do
echo $WESTOS
done
练习:
check_host.sh
用此脚本检测10台主机与当前主机直连的主机是否网络通常
如果网络通常请显示主机的ip列表
参考一:
#!/bin/bash
for ((IP=1;IP<11;IP++))
do
ping -c1 -w1 192.168.0.$IP &> /dev/null &&{
echo "192.168.0.$IP"
}
done
参考二:
#!/bin/bash
for ((IP=1;IP<11;IP++))
do
ping -c1 -w1 192.168.0.$IP &> /dev/null
[ "$?" = "0" ]&&{ #其中,"$?"表示退出值,若为0,则表示上面的命令执行正确
echo "192.168.0.$IP"
}
done
格式1:
练习:
执行结果:只有192.168.0.1可以ping通
2.while
while ture #条件为真
do
条件成立所作循环动作
done
3.until
until false #条件为假
do
条件不成立所作循环动作
done
4.if
格式:
if
then
fi
或者:
if
then
elif #相当于c语言中的else if
then
...
else
fi
脚本练习:
vim check_file.sh
please input filename: file
提示:
file is not exist或file is file或file is direcory
此脚本会一直询问 直到用户输入exit为止
参考一:使用while和if语句实现
#!/bin/bash
while true
read -p "Please input filename:" FILENAME
do
if [ "$FILENAME" = exit ]
then
echo "bye"
exit
elif [ ! -e "$FILENAME" ]
then
echo "$FILENAME is not exist"
elif [ -L "$FILENAME" ]
then
echo "$FILENAME is a link"
elif [ -f "$FILENAME" ]
then
echo "$FILENAME is a common file"
elif [ -S "$FILENAME" ]
then
echo "$FILENAME is a socket"
elif [ -d "$FILENAME" ]
then
echo "$FILENAME is a directory"
fi
done
参考二:使用函数的方式实现
#!/bin/bash
Check_File()
{
if [ "$1" "$2" ]
then
echo $3
ACTION
fi
}
ACTION()
{
read -p "Please input filename:" FILENAME
if [ "$FILENAME" = exit ]
then
echo "bye"
exit
elif [ ! -e "$FILENAME" ]
then
echo "$FILENAME is not exist"
fi
Check_File -L $FILENAME "$FILENAME is linkfile"
Check_File -f $FILENAME "$FILENAME is common file"
Check_File -S $FILENAME "$FILENAME is socket"
Check_File -d $FILENAME "$FILENAME is directory"
ACTION
}
ACTION
if语句示例:
注意:if语句执行时,当一个条件满足时,后面条件将不会再执行
参考一:
参考二:
5.case
case $1 in
word1|WORD1)
action1
;;
word2|WORD2)
action2
;;
*)
action3
esac
练习:
vim system_watch.sh
后接:disk memory upload (每秒显示一次)
disk 监控磁盘使用情况(查看磁盘情况:df)
memory 监控内存使用情况(查看内存情况:free -m)
upload 监控系统负载(查看系统负载的命令:uptime)
参考示例:
#!/bin/bash
case $1 in
disk|DISK)
watch -n 1 df
;;
memory|MEMORY)
watch -n 1 free -m
;;
upload|UPLOAD)
watch -n 1 uptime
;;
*)
echo "please input disk|memory|upload following $0"
esac
case语句示例:
点名机制:无论输入什么,都只执行其中的一个命令,并不是按顺序执行。
练习:
6.expect
expect:自动应答语句
expect有自己的运行环境,因此需要安装expect软件包:yum install expect -y
问题脚本:vim ask.sh
#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE
read -p "Which objective: " OBJ
read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK
应答脚本:vim answer.exp
#!/usr/bin/expect
set timeout 1
set NAME [ lindex $argv 0 ] #set:设定expect中的变量
set AGE [ lindex $argv 1 ] #AGE是脚本中的第二串字符
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh #监控/mnt/ask.sh文件
expect {
"name" { send "$NAME\r";exp_continue } #当出现关键字name时....
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" }
}
expect eof #回答完问题后退出expect环境(或:interact,回答完问题后保留expect环境)
练习:
auto_ssh 192.168.0.1 westos
可以自动连接目标主机,当目标主机网络不通时报错
参考:
#!/bin/bash
AUTO_CMD()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 "$3"
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" {send "$2\r" }
}
expect eof
EOF
}
ping -c1 -w1 $1 &> /dev/null && {
AUTO_CMD $1 $2 "$3"
}
示例:
练习:
7.break,continue,exit
continue #终止当前循环提前进入下个循环
break #终止当前所在语句所有动作进行语句外的其他动作
exit #退出脚本
continue作用示例:
break作用示例:
exit作用示例:
结束!!!