shell 中常用的控制语句及脚本运行控制
一.shell 中常用的控制语句
for 语句
while 语句
if 语句
case 语句
expect 语句
exit 退出
break 退出循环
continue 退出当前循环
1.for语句:
for 语句:
for NUM in 1 2 3
for NUM in {1..3}
for NUM in `seq 1 3` 或者 for NUM in `seq 1 2 10`
do
done
示例:
编辑脚本10秒倒计时:
vim time——end.sh 编辑脚本
内容:
#!/bin/bash
for Time in {10..1}
do
echo -n "after $Time is end!"
echo -ne "\r\r"
sleep 2
done
执行结果:
示例:
编辑脚本:create_user.sh
要求:
1.自动建立userfile文件中的用户
2.建立passwd文件中的用户密码,和userfile中的用户一一对应。
#!/bin/bash
Min_Num=`awk 'BEGIN{N=0}{N++}END{print N}' userfile`
for NUM in `seq 1 "$Min_Num"`
do
User_name=`sed -n ""$NUM"P" userfile`
Passwd=`sed -n ""$NUM"p" passwdfile`
useradd $User_name
echo $Passwd | passwd --stdin $User_name &>/dev/null
done
cat /etc/passwd | tail -n 3
执行结果:
2.while 语句:
while 语句:
while
do
done
示例:while循环
while 语句循环:
#!/bin/bash
while true
do
read -p "please input a word: " WORD
echo $WORD
[ "$WORD" = "exit" ] && {
echo bye!
break
}
done
echo hello word
执行结果:
示例:
检测系统中的/设备使用量超过30%以邮件形式发送给root用户。
vim Disk.sh 编辑脚本
内容:
#!/bin/bash
Disk_Value=`df | awk -F " " '/\/$/{print $5}' |awk -F "%" '{print $1}'`
while [ $Disk_Value -ge 30 ]
do
echo warning:disk will full!! >> /var/log/messages
sleep 10
done
执行结果:查看系统日志
3.if语句:
if语句:
if
then
elif
then
。。。
else
fi
示例:
if语句:
用if语句编写脚本:vim create_user.sh创建用户
#!/bin/bash
if [ $# -lt 2 ]
then
echo Error:please give me userfile and passwdfile!
elif [ ! -e $1 ]
then
echo Error:$1 is not exist!
elif [ ! -e $2 ]
then
echo Error:$2 is not reist!
else
Min_Num=`awk 'BEGIN{N=0}{N++}END{print N}' userfile`
for NUM in `seq 1 "$Min_Num"`
do
User_name=`sed -n ""$NUM"P" userfile`
Passwd=`sed -n ""$NUM"p" passwdfile`
useradd $User_name
echo $Passwd | passwd --stdin $User_name &>/dev/null
done
fi
执行结果:
示例:
编写脚本test.sh,当输入cat是输出dog;
输入dog时;输出cat;其他时报错。
#!/bin/bash
if [ "$1" = cat ]
then
echo dog
elif [ "$1" = dog ]
then
echo cat
else
echo Error!
fi
执行结果:
4. case 语句:
case语句:横向同时比较,效率优于if语句
word1 )
action1
;;
word2)
action2
;;
........
*)
action_last
esac
示例:
vim http_service.sh 编辑脚本
内容:
#!/bin/bash
[ -z $1 ] && {
echo Error:please input a commond after script!
exit 1
}
case $1 in
start)
systemctl start httpd
;;
port)
netstat -antuple | grep httpd
;;
enable)
systemctl enable httpd
;;
*)
echo Error:$1 is not found!
esac
systemctl restart httpd
执行结果:
5.expect语句:
expect语句需要安装expect服务
expect:自动应答脚本,具备自己运行的环境;针对某一脚本自动输出结果。
查看相关命令的脚本:
[root@localhost mnt]
/usr/bin/passwd
[root@localhost mnt]
/usr/bin/expect
[root@localhost mnt]
示例1:
1.vim passwd.exp 编辑脚本自动修改root用户密码
内容:
spawn passwd
expect "New"
send "123\r"
expect "Retype"
send "123\r"
expect eof
执行结果:
示例2:
2.vim ssh.exp 编辑脚本,自动链接指定主机并停在当前位置。
内容:
set IP [ lindex $argv 0]
set PASSWD [ lindex $argv 1]
spawn ssh root@$IP
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$PASSWD\r" }
}
interact
执行结果:
示例3:
3.vim check_hostname.sh 编辑脚本,输出1-5网络通的主机名
内容:
#!/bin/bash
for IP in {1..5}
do
ping -c1 -w1 172.25.254.$IP &>/dev/null && {
/bin/expect <set timeout 2
spawn ssh root@172.25.254.$IP hostname
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "westos\r" }
}
expect eof
EOF
}
done
二.shell脚本运行控制
1.exit 退出脚本,可给出退出值
1.vim exit.sh 编辑脚本
内容:
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ]
do
echo $i hello
exit
done
done
执行结果:
2.break:退出当前循环
2.vim exit.sh 编辑脚本
内容:
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ]
do
echo $i hello
break
done
done
执行结果:
3. continue:提前结束循环内部的命令,但不终止该循环
3.vim exit.sh 编辑脚本
内容:
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ]
do
echo $i hello
continue
done
done
执行结果: 陷入死循环
三.shell运算
脚本示例1.: (())运算赋值
比较法:
vim time.sh 编辑脚本,实现1分30秒倒计时
内容:
#!/bin/bash
M_time=1
S_time=10
for ((;S_time>=0;S_time--))
do
[ "$S_time" -eq "0" -a "$M_time" -eq "0" ] && exit 0
while [ "$S_time" -eq "0" -a "$M_time" -ge "0" ]
do
echo -n "After $M_time:$S_time is end!"
echo -ne "\r\r"
((M_time--))
S_time=59
done
echo -n "After $M_time:$S_time is end!"
echo -ne "\r\r"
sleep 1
done
执行结果:
示例:
四则云算法:
vim time_运算.sh 编辑脚本,1分30秒倒计时。
内容:
#!/bin/bash
M_time=$1
S_tiem=$2
let TIME=(M_time*60)+S_tiem
for ((;TIME>=0;TIME--))
do
MIN=$[ $TIME/60 ]
SEC=$[ $TIME%60 ]
echo -n "After $MIN:$SEC in end!"
echo -ne "\r\r"
sleep 1
done
执行结果: