1、for语句
for Num in 1 5 7
do
echo $Num
sleep 1 ##休眠时间为1s,即间隔一秒再次执行
done
for Num in {1..10}
for Num in {10..1}
for Num in `seq 1 2 10` ##步长为2
例1:编写脚本 text.sh ,从userfile中取出要建立用户名建立用户
#!/bin/bash
[ -z "$1" ] && { ##检测是否为空
echo "please input userfile!!"
exit 1
}
[ ! -e "$1" ] && { ##检测是否存在
echo "ERROR : $1 is not exist"
exit 2
}
for NAME in `cat $1`
do
id $NAME &> /dev/null
[ "$?" -eq "0" ] && {
echo "$NAME is exist!!"
}||{
useradd $NAME &>/dev/null
echo "$NAME is created!"
}
done
例2:10秒倒计时
#!/bin/bash
TTY=`ps $$| grep $$ |awk '{print $2}'`
for Num in {10..1}
do
clear
echo -ne $Num > /dev/$TTY
echo -ne '\r \r' ##不换行
sleep 1 ##间隔1s
done
2、while语句 ----只判定一次
当条件为真
while true
do
done
update ##监测系统负载
echo$$ ##显示当前id
例子:显示时间
#!/bin/bash
TTY=`ps $$| grep $$ |awk '{print $2}'`
while true
do
clear ##清屏
echo -ne `uptime` > /dev/$TTY
echo -ne '\r \r' ##不换行
sleep 1
done
3、if语句 可以在一直判定,从上到下依次判定
if
then
elif
then
elif
then
else ##可以不写
fi
例:运行 userfile.sh,检测文件类型
#!/bin/bash
if [ -z "$1" ]
then
echo "Error!!Please input a filename follow script!"
elif [ ! -e "$1" ]
then
echo "Error!! filename is not exist!"
elif [ -L "$1" ]
then
echo "$1 is a link file"
elif [ -f "$1" ]
then
echo "$1 is a file"
elif [ -d "$1" ]
then
echo "$1 is a directory"
elif [ -b "$1" ]
then
echo "$1 is a block"
elif [ -c "$1" ]
then
echo "$1 is a char"
fi
4、case语句 --选择性操作时用,相比if更快
例1: 写echo.sh,当输入A时,输出B,当输入B,输出A,其他输入,输出error
case $1 in
A)
echo B
;;
B)
echoA
;;
*)
echo error
esac
例2,建立 virt_ctrl.sh ,使sh virt_ctrl.sh delete|start|stop|create desktop
#!/bin/bash
case $1 in
start)
virsh start $2
virt-viewer
;;
stop)
virsh destory $2
;;
delete)
virsh undefine $2
rm -fr /var/lib/libvirt/images/$2.qcow2
;;
create)
virt-install \
--cdrom /home/kiosk/Desktop/rhel-server-7.3-x86_64-dvd.iso \
--memory 1000 \
--vcpus 1 \
--disk /var/lib/libvirt/images/$1.qcow2,size=8,bus=virtio \
--network bridge=br0,model=virtio \
--name $1 >/dev/null &
;;
*)
echo error
esac
5、export
expect ----是自动应答命令,用于交互式命令的自动执行
spawn ----是expect中的监控程序,其运行后会监控命令提出的交互问题
send ----发送问题答案给交互命令
“\r” ----表示回车
exp_continue ----表示当问题不存在时继续回答下面的问题
expect eof ----表示问题回答完毕退出expect环境
interact ----表示问题回答完毕留在交互界面
set NAME[ lindex $argv n ] ##定义变量
yum install expect -y ##安装expect服务
例1: sh auto_ssh 172.25.254.47 redhat ,可以登录到47主机
#!/bin/bash
/usr/bin/expect <<EOF
spawn ssh $1 ##执行的命令
set timeout 3 ##等待时间为3s
expect {
"connecting" { send "yes\r" ; exp_continue }
"password" { send "$2\r" ; exp_continue }
interact ##表示登录后停留在当前环境 ,eof表示登录后退出
}
EOF
例2:检测1-10主机是否开启,并显示主机名
#!/bin/bash
Auto_ssh()
{
/usr/bin/expect << EOF
set timeout 10
spawn ssh root@172.25.254.$1 $2 ##此处$1 $2 $3 分别指 $NUM hostname redhat expect {
"yes/no" { send "yes\r";exp_continue}
"password" { send "$3\r"}
}
expect eof
EOF
}
for NUM in {1..10}
do
ping -c1 -w1 172.25.254.$NUM &> /dev/null
if
[ "$?" -eq "0" ]
then
Auto_ssh $NUM hostname redhat |grep password: -A1 | grep password -v ##-A1表示关键字和关键字后一个,
fi
done
6、脚本中的语句控制器
exit ##脚本退出,退出值为n
break ##退出当前循环
continue ##提前结束循环内部的命令,但不终止循环
测试
#!/bin/bash
for i in {1..10}
do
if
[ "$i" = "5" ]
then
echo lucky num
continue|break|exit
fi
echo $i
done
echo westos