脚本中的语句控制句
1.语句控制句
exit n 脚本退出,退出值为n
break 退出当前循环
continue 提前结束循环内部的命令,但不终止循环
下面我们用实验来看看他们的作用效果:
写一个脚本,显示1-10,但不显示4
方法一:break实现
1 vim test2.sh #不显示4,从1-10
#!/bin/bash
for NUM in {1..10}
do
while
[ ! "$NUM" -eq "4" ]
do
echo $NUM
break
done
done
2 sh test2.sh
方法二:用continue实现:
1 vim test3.sh
continue 4 #每次遇到4,自动跳过
#!/bin/bash
for NUM in {1..10}
do
while
[ "$NUM" = "4" ]
do
continue 4
done
echo $NUM
done
sh test3.sh
2 SHELL中常用的运算命令:
2.1 >运算操作和运算命令 含义
(()) 用于整数运算let 用于整数运算,与(())类似
expr 用于整数运算,功能相对较多
bc linux下的运算器,时和整数及小数运算
$[ ] 用于整数运算
2.2>运算方式及运算符号
运算符号 意义(*标示常用)+,- 加法,减法
*,/,% 乘法,除法,取余
** 幂运算
++,-- 自增加,自减少
<,<=,>,>= 比较符号
=,+=,-=,*=,/=,%= 赋值运算,例如a+=1相当于a=a+1
实验操作:
1 ((a=1+1)) #计算1+1的值,赋给a
2 echo $a
3 a=1+1 #不计算,把“1+1”整体赋给a
4 echo $a
5 let a=1+1 #计算1+1的值,赋给a
6 echo $a
7 echo `expr 1+1` #1+1
8 echo `expr 1 + 1` #计算1+1的值
9 bc <<EOF #计算器
1+1
2+2
EOF
10 echo $[2**3] #2的3次幂运算
11 echo $[2*3] #2*3
12 echo $[a+=2] #a=a+2,计算a+2的值,并赋给a
13 echo $a
14 echo $[a+=2] #a=a+2,计算a+2的值,并赋给a
15 echo $[a-=2] #a=a-2,计算a-2的值,并赋给a
16 echo $[a>=2] #比较a和2的值,a大于等于2,输出为1
17 echo $[a<=2] #比较a和2的值,a大于2,输出为0
写一个计算器脚本,输入什么,计算出值:
1 vim calculator.sh
方法一:
#!/bin/bash
echo $(($1$2$3))
方法二:
#!/bin/bash
echo $[$1$2$3]
方法三:
#!/bin/bash
bc <<EOF
$1$2$3
EOF
2 sh calculator.sh 1*2 测试
十秒倒计时:
vim time1.sh
#!/bin/bash
for ((Time_Num=10;Time_Num>=0;Time_Num--))
do
echo -n "$Time_Num "
echo -ne "\r\r"
sleep 1
done
一分十秒的倒计时:
方法一:逻辑关系:
1 vim time2.sh #逻辑关系
#!/bin/bash
for ((Minute=1;Minute>=0;Minute--))
do
Second=10
[ "$Minute" -eq "1" ] || Second=60
for ((Time=$Second;Time>=0;Time--))
do
echo -n "$Minute:$Time "
echo -ne "\r\r"
sleep 1
done
done
方法二:计算取余:1 vim time3.sh #计算取余
#!/bin/bash
read -p "Please input minute follow the script: " M
read -p "Please input second follow the script: " S
I=$[M*60+S]
for ((P=$I;P>=0;P--))
do
A=$[$P/60]
B=$[$P%60]
echo -ne "\r$A:$B \r"
sleep 1
done

给60-64主机上面建用户
1 vim useradd_create.sh
#!/bin/bash
##########Rule Check###########
if
[ "$#" -ne "2" ]
then
echo "ERROR1:Please input userfile and passfile follow the script!!"
exit 1
elif
[ ! -e "$1" ]
then
echo "ERROR2:Sorry, $1 is not exist !!"
exit 1
elif
[ ! -e "$2" ]
then
echo "ERROR3:Sorry, $2 is not exist !!"
exit 1
elif
USERFILE_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
PASSFILE_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $2`
[ ! "$USERFILE_LINE" -eq "$PASSFILE_LINE" ]
then
echo "ERROR4:$1's line is different from $2's line !!"
exit 1
fi
##############Auto_Connect(执行动作的前提条件)###########
Auto_Connect()
{
/usr/bin/expect <<EOF | grep -E "authenticity|ESDSA|connecting|Warning|spawn|password" -v
set timeout 5
spawn ssh root@172.25.254.$IP "$1" #此处的$1时Auto_Connect之后的第一串字符,即连接上主机后要执行的动作,并不是脚本的第一串字符,即执行动作模块中的Auto_Connect "echo $PASSWORD |passwd --stdin $USERNAME"
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "westos\r"}
}
expect eof
EOF
}
##############执行动作#############for IP in {60..64}
do
ping -c1 -w1 172.25.254.$IP &>/dev/null && {
Max_Line=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
for Line_Num in `seq 1 $Max_Line`
do
USERNAME=`sed -n ${Line_Num}p $1`
PASSWORD=`sed -n ${Line_Num}p $2`
User_Check=`Auto_Connect "useradd $USERNAME"`
[ -n "$User_Check" ]&&{
echo $User_Check
}||{
Auto_Connect "echo $PASSWORD |passwd --stdin $USERNAME"
}
done
}|| echo 172.25.254.$IP is down
done
测试:
1 sh useradd_create.sh
2 sh useradd_create.sh userfile passfile
3 sh useradd_create.sh userfile passfile
4 vim userfile
5 vim passfile
6 sh useradd_create.sh userfile passfile
