linux系统中的shell中的常用语句 || shell脚本运行控制 || shell运算
程序员文章站
2022-06-24 19:40:53
...
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 #停留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" ] && { #判断当输入的字符是exit
echo bye! #输出bye!
break #跳出循环
}
done #跳出循环后执行
echo hello word #输出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 ] #使用量和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 ] #脚本后的所有字符小于2
then #则输出
echo Error:please give me userfile and passwdfile!
elif [ ! -e $1 ] #判定$1文件是否存在
then #则输出
echo Error:$1 is not exist!
elif [ ! -e $2 ] #判定$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时执行
start)
systemctl start httpd
;;
port) #脚本后字符为port时执行
netstat -antuple | grep httpd
;;
enable) #脚本后字符为ebable时执行
systemctl enable httpd
;;
*)
echo Error:$1 is not found!
esac
systemctl restart httpd
执行结果:
5.expect语句:
expect语句需要安装expect服务
expect:自动应答脚本,具备自己运行的环境;针对某一脚本自动输出结果。
查看相关命令的脚本:
[root@localhost mnt]# which passwd
/usr/bin/passwd
[root@localhost mnt]# which expect
/usr/bin/expect
[root@localhost mnt]#
示例1:
1.vim passwd.exp 编辑脚本自动修改root用户密码
内容:
#!/bin/expect
spawn passwd
expect "New"
send "123\r"
expect "Retype"
send "123\r"
expect eof
执行结果:
示例2:
2.vim ssh.exp 编辑脚本,自动链接指定主机并停在当前位置。
内容:
#!/bin/expect
set IP [ lindex $argv 0] #脚本后的第一串字符
set PASSWD [ lindex $argv 1] #脚本后的第二串字符
spawn ssh aaa@qq.com$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 <<EOF
set timeout 2
spawn ssh aaa@qq.com172.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 ] #当$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 ] #当$i等于5时
do
echo $i hello
# exit
break #退出当前的while循环
# continue
done
done
执行结果:
3. continue:提前结束循环内部的命令,但不终止该循环
3.vim exit.sh 编辑脚本
内容:
#!/bin/bash
for i in {1..10}
do
echo $i
while [ $i = 5 ] #当$i等于5时
do
echo $i hello
# exit
# break
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