shell 中常用的控制语句及脚本运行控制

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 #这里的点是Tab键上方的键位
do
done
写一个脚本,实现10s倒计时:
for a in {10…1} #循环10次
do
echo -ne "$[a]s " #显示秒数
echo -ne “\r” #覆盖上一个时间显示
sleep 1 #睡1秒
done
在这里插入图片描述
在这里插入图片描述
写一个脚本,自动ping前20号主机,如果ping得通,将ping得通的主机号写入host_ip中:
[ -e “/mnt/host_ip” ]&&{ #先判定host_ip文件是否存在,如果存在,将执行以下操作
echo /mnt/host_ip is exist!!
echo “[O]verwrite [B]ackup [S]kip”
read -p "What do you want action: " WORD
ACTION=echo $WORD| tr 'a-z' 'A-Z' #将小写的字母转换为大写的字母
[ “$ ACTION” = “O” ] && { #O:将源文件覆盖
rm -fr /mnt/host_ip
}
[ “$ ACTION” = “B” ] && { #B:将源文件备份,用本次执行结果覆盖源文件
mv /mnt/host_ip /mnt/host_ip.bak
}
[ “$ ACTION” = “S” ] && { #S:跳过,不执行下面的操作,直接结束脚本
exit 0
}
}
for ip in {1…20}
do
ping -c1 -w1 172.25.254.$ ip &> /dev/null &&{
echo 172.25.254.$ip >> /mnt/host_ip #将ping得通的主机号写入host_ip文件
}
done
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

while 语句

while语句与until语句刚好相反:
while 条件 #当此条件达成时,执行以下操作,直到条件不满足时,跳出循环
do
done
until 条件 #当条件不满足时,执行以下操作,直到条件达成时,跳出循环
do
done
写一个脚本,实现1分10秒的倒计时:
SEC=10 #设置秒数为10
MIN=1 #设置分钟数为1
for ((SEC=10;SEC>=0;SEC–)) #设置秒数的初始值为10,当秒的值大于等于0时,执行以下操作,秒数自减一
do while [ “$ SEC” = “0” -a “$ MIN” = “0” ] #直到秒数和分钟数都等于0,退出脚本
do exit 0
done
echo -ne "$ MIN:$ SEC " #输出倒计时
echo -ne “\r” #覆盖上一个输出的倒计时
sleep 1 #睡1秒
[ “$ SEC” = “0” ] && {
[ “$ MIN” -ge “1” ] && { #当秒数为0,而分钟数大于等于1,执行以下操作
((MIN–)) #分钟数自减一
SEC=59 #秒数等于59
echo -ne "$ MIN:$SEC "
echo -ne “\r” #输出,覆盖
sleep 1 #睡1秒
}||{ exit 0
}
}
done
在这里插入图片描述
在这里插入图片描述

if 语句

if
then
elif
then

else
fi
写一个脚本,该脚本可以判断指定文件的类型:
AA()
{
read -p “Please input filename:” NAME #输出exit或EXIT退出
if [ “$ NAME” = “exit” -o “$ NAME” = “EXIT” ]
then echo “bye”
exit 0
elif [ -z “$ NAME” ] #文件名是否为空
then AA
elif [ ! -e “$ NAME” ] #文件是否存在
then echo “$ NAME is not exist!!!”
AA
elif [ -L “$ NAME” ] #文件是否是软连接
then echo “$ NAME is softlink file”
AA
elif [ -d “$ NAME” ] #文件是否是目录
then echo “$ NAME is direcotry”
AA
elif [ -f “$ NAME” ] #文件是否是普通文件
then echo “$NAME is common file”
AA
fi
}
AA
在这里插入图片描述
在这里插入图片描述
用if语句写一个脚本,该脚本可以对指定的文件进行创建、删除、备份:
if [ “$1” = “-a” ] #当后面跟的字符为-a,对-a后跟的文件名进行创建
then [ -z “$2” ] && { #判定是否输入文件名
echo “Please input filename following -a”
exit 1
}||{
[ -e “$2” ] && { #判定文件是否存在
echo “$2 is exist”
exit 1
}||{
echo “$2 has be created!” #若不存在,则以-a后跟的文件名创建文件
touch “$2”
exit 0
}
}
在这里插入图片描述
elif [ “$1” = “-d” ] #当后面跟的字符为-d,对-d后跟的文件名进行删除
then [ -z “$2” ] && { #判定是否输入文件名
echo “Please input filename following -d”
exit 1
}||{
[ -e “$2” ] || { #判定文件是否存在
echo “$2 is not exist”
exit 1
}&&{
echo “$2 has be deleted!!” #若存在,则对-d后跟的文件名进行删除
rm -rf “$2”
exit 0
}
}
在这里插入图片描述
elif [ “$1” = “-p” ] #当后面跟的字符为-p,对-p后跟的文件名进行备份
then [ -z “$2” ] && { #判定是否输入文件名
echo “Please input filename following -p”
exit 1
}||{ [ -e “$2” ] || { #判定文件是否存在
echo “$2 is not exist”
exit 1
}&&{ echo “$2 has be backed up!!!” #若存在,则对-p后跟的文件名进行备份
cp -p “$2” /mnt/"$2".bak
exit 0
}
}
else echo “Please input -a or -d or -p following filectrl.sh!!!” #若后面跟的字符不是上述三种中的任意一种,则报错并退出
exit 0
fi
在这里插入图片描述
在这里插入图片描述

case 语句

case
word1 )
action1
;;
word2)
action2
;;

*)
action_last
esac
用case语句实现上一个脚本的功能,用if语句会增加脚本的执行时间,而case语句可以避免这一情况:
case “$1” in
-a) #匹配到-a时,执行以下操作
{ [ -z “$2” ] && { #判定是否输入文件名
echo “Please input filename following -a”
exit 1
}||{
[ -e “$2” ] && { #判定文件是否存在
echo “$2 is exist”
exit 1
}||{
echo “$2 has be created!” #若不存在,则以-a后跟的文件名创建文件
touch “$2”
exit 0
}
}
}
;;
在这里插入图片描述
-d) #匹配到-d时,执行以下操作
{ [ -z “$2” ] && { #判定是否输入文件名
echo “Please input filename following -d”
exit 1
}||{
[ -e “$2” ] || { #判定文件是否存在
echo “$2 is not exist”
exit 1
}&&{ echo “$2 has be deleted!!” #若存在,则对-d后跟的文件名进行删除
rm -rf “$2”
exit 0
}
}
}
;;
在这里插入图片描述
-p) #匹配到-p时,执行以下操作
{ [ -z “$2” ] && { #判定是否输入文件名
echo “Please input filename following -p”
exit 1
}||{ [ -e “$2” ] || { #判定文件是否存在
echo “$2 is not exist”
exit 1
}&&{ echo “$2 has be backed up!!!” #若存在,则对-p后跟的文件名进行备份
cp -p “$2” /mnt/"$2".bak
exit 0
}
}
}
;;
*) #匹配到其他字符时,执行以下操作
{ echo “Please input -a or -d or -p following filecase.sh!!!” #报错,退出
exit 0
}
esac
在这里插入图片描述
在这里插入图片描述

expect

expect 是自动应答命令用于交互式命令的自动执行
spawn 是 expect 中的监控程序,其运行后会监控命令提出的交互问题
send 发送问题答案给交互命令
“\r” 表示回车
exp_continue 标示当问题不存在时继续回答下面的问题
expect eof 标示问题回答完毕退出 expect 环境
interact 标示问题回答完毕留在交互界面
set NAME [ lindex $argv n ] 定义变量
要使用expect,需要下载安装expect:
yum install expect
在这里插入图片描述
写一个脚本,可以自动ssh连接到输入的主机,用expect自动应答yes/no、密码:
#!/usr/bin/expect #必须用expect解释器
set IP [ lindex $argv 0 ] #脚本后跟的第一个字符
set PASSWORD [ lindex $argv 1 ] #脚本后跟的第二个字符
spawn ssh root@172.25.254. $IP #监控ssh连接 $IP时的操作
expect {
“sure” { send “yes \r”;exp_continue } #当检测到sure时,自动输入yes
“password” { send " $ PASSWORD\r" } #当检测到password时,自动输入脚本后跟的第二个字符
}
interact #执行完上述操作后,不中断交互
在这里插入图片描述

在这里插入图片描述
写一个脚本,功能是在1到10号主机中,如果能ping得通,则远程在其中建立userfile中的用户,用户密码为passfile中的对应的行:
QQ()
{
/usr/bin/expect <<EOF
spawn ssh root@172.25.254.$1 $2 #ssh连接到指定的主机,执行 KaTeX parse error: Can't use function '\r' in math mode at position 45: …no" { send "yes\̲r̲";exp_continue …{L};M++)) #用户文件中有几行,就执行几次
do QQ 139 "useradd sed -n ${M}p /mnt/QAQ/userfile &> /dev/null && echo sed -n ${M}p /mnt/QAQ/passfile| passwd --stdin sed -n ${M}p /mnt/QAQ/userfile &> /dev/null "
done #连接到指定的主机,执行建用户和给用户赋密码的操作
}
#done
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

脚本中的语句控制器

exit n 脚本退出,退出值为n #直接退出脚本
for ((NUM=0;NUM<=10;NUM++))
do echo “$ NUM”
[ “$NUM” = 5 ] &&{ #当NUM等于5时,执行下列操作
exit 1
}
done
echo “redhat”
在这里插入图片描述
在这里插入图片描述
break 退出当前循环
for ((NUM=0;NUM<=10;NUM++))
do echo " $NUM"
[ " $NUM" = 5 ] &&{
#exit 1
break
}
done
echo “redhat”
在这里插入图片描述
在这里插入图片描述
continue 提前结束循环内部的命令,但不终止循环
for ((NUM=0;NUM<=10;NUM++))
do echo " $NUM"
[ " $NUM" = 5 ] &&{
#exit 1
#break
continue
echo “AA”
}
done
echo “redhat”
脚本没加continue之前的执行结果:
在这里插入图片描述
在这里插入图片描述
脚本加了continue之后的执行结果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值