for 语句
格式
一般格式:
格式1:
for((条件))
do
动作
done
格式2:
for 变量名 in 范围
do
动作
done
例1:
输出10秒倒计时
vim y.sh
{
#!/bin/bash
for SEC in {10..1}
do
echo -n "After ${SEC}s is end"
echo -ne "\r"
sleep 1
done
}
例2:
vim y1.sh
{
#!/bin/bash
[ -e "/test/host_ip" ] &&{
echo /test/host_ip is exist !!
echo "[O]verwrite [B]ackup [S]kip"
read -p "Please input your action: " WORD
ACTTON=`echo $WORD | tr 'a-z' 'A-Z'`
[ "$ACTTON" = "O" ] &&{
rm -rf /test/host_ip
}
[ "$ACTTON" = "B" ] &&{
mv /test/host_ip /test/host_ip.bak
}
[ "$ACTTON" = "S" ] &&{
exit 0
}
}
for ip in {1..20}
do
ping -c1 -w1 172.25.254.$ip &> /dev/null &&{
echo 172.25.254.$ip >> /test/host_ip
}
done
}
while 语句
格式
一般格式:
while 条件
do ##满足条件则执行动作
动作
done
vim w.sh
{
#!/bin/bash
while true
do
read -p "Please input word:" WORD
echo $WORD
done
}
嵌套循环
1. for循环的嵌套
for((条件))
do
for((条件))
do
动作
done
done
2.while循环的嵌套
while 条件
do
while 条件
do
动作
done
done
打印乘法口诀表
分析:乘法口诀表有9行9列,并且当前的行数等于当前的列数,即第1行有1个等式,第2行有2个等式;显示需要用到嵌套循环
方法1:
[root@localhost mnt]# vim 9*9.sh
#####################
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
echo -n "$i*$j=$[$i*$j] "
done
echo -e "\n" ##\n表示换行;注意:必须加-e解析
done
[root@localhost mnt]# sh 9*9.sh
方法2:
[root@localhost mnt]# vim 9*9.sh
####################
for((i=1;i<=9;i++))
do
for((j=1;j<=i;j++))
do
echo -ne "$i*$j=$[$i*$j]\t" ##-t表示4个空格
if ##注意:if语句中的条件必须有空格才能生效
[ $i = $j ]
then
echo -e "\n"
fi
done
done
[root@localhost mnt]# sh 9*9.sh
until 语句
vim u.sh
{
#!/bin/bash
until false
do
read -p "Please input word: " WORD
echo $WORD
done
}
例:
倒计时1分10秒
vim l.sh
{
#!/bin/bash
SEC=10
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
while [ "$SEC" = "0" -a "$MIN" = "0" ] #当分和秒都为0时退出
do
exit 0
done
while [ "$SEC" = "0" ] #当秒为0时执行while语句中内容
do
echo -ne "After $MIN:$SEC is end !!"
echo -ne "\r"
sleep 1
SEC=59
((MIN--)) #当秒为59时分自减1
done
echo -ne "After $MIN:$SEC is end !!"
echo -ne "\r"
sleep 1
done
}
if 语句
格式
if语句的一般形式:
(1).单个条件
if 条件
then 执行命令
fi
if 条件1
then 执行命令1
else 执行命令2
fi
(2).多个条件
if 条件1
then 执行命令1
elif 条件2
then 执行命令2
.....
else 执行命令3
fi
几种常见的退出方式:
exit ##退出当前脚本
break ##退出当前循环
continue ##提前退出当前循环,进入下一次循环
注意:eq不能用于比较字符串,比较字符串只能用 ==
例:
当输入 -a 时建立文件
-d 时删除文件
-p 时移动文件
输入其他时报错 : Please input -a | -d | -p fllowing filectrl.sh
vim filectrl.sh
{
#!/bin/bash
CLO(){
echo -e "\033[${1}m$2\033[0m"
} #设定颜色函数,方便调用
NAME(){ #设定函数用于循环
read -p "Please input your action: " WORD
if [ "$WORD" = "-a" ] #判断输入是否为-a后执行-a的操作
then
read -p " Please input filename: " FILE
[ -e "$FILE" ] &&{
CLO 31 "$FILE is exit" #判断所要建立的文件是否存在,存在时提醒文件已经存在
}||
{
touch $FILE
CLO 32 "$FILE touch successful "
} #文件不存在时,建立文件,建立后提示文件建立成功
elif [ "$WORD" = "-d" ] #判断输入是否为-d后执行-d的操作
then
read -p "Please input delete filename: " FILE
[ -e "$FILE" ] &&{ #如果文件存在就执行删除命令,删除后提示删除成功
rm -rf $FILE
CLO 32 "$FILE is deleted "
}||
{
CLO 31 "$FILE is not exit !!!" #文件不存在提示文件不存在
}
elif [ "$WORD" = "-p" ]
then
read -p "Please input move filename: " FILE
[ -e "$FILE" ] ||{
CLO 31 "$FILE is not exit !!!"
}&&
{
mv $FILE /mnt
CLO 32 "$FILE is moved"
} #文件存在执行复制命令,文件不存在提示文件不存在
else
CLO 31 "Please input -a | -d | -p fllowing filectrl.sh"
exit 0 #输入的不是-a -d -p 会退出
fi
NAME
}
NAME
}
case 语句
格式
case 变量名 in
常量1) ##可以用于判断多个条件;当常量1与变量名相同时,执行命令1,以此类推
命令1
;;
常量2)
命令2
esac
if语句与case语句的区别
if语句中的条件判断是从上到下顺序依次判断
case语句中的条件判断是同步的
例:
当输入 -a 时建立文件
-d 时删除文件
-p 时移动文件
输入其他时报错 : Please input -a | -d | -p fllowing filectrl.sh
vim case.sh
{
#!/bin/bash
Check_File()
{
if [ -e "$1" ]
then
$2
$3
fi
}
if [ "$#" -lt "2" ]
then
echo "Error:Please input option [-a|-p|-d] and filename following $0"
exit 0
fi
case $1 in
-a|a|-A|A)
Check_File $2 "echo $2 is exist !!" exit
touch $2
;;
-d|d|-D|D)
Check_File $2 "rm -rf $2" exit
echo "$2 is not exis"
;;
-p|p|-P|P)
Check_File $2 "cp -rp $2 /mnt" exit
echo "$2 is not exist"
;;
*)
echo "Please input -a|-d|-p following $0 !!"
esac
}
expect
例:
找出1-10号机中开着的主机,并将主机名 ip 存放到/mnt/host_list下
vim auto.sh
{
#!/bin/bash
Auto_Connect()
{
/usr/bin/expect <<EOF
spawn ssh root@$1 $2
expect {
"yes/no" { send "yes\r" ; exp_continue }
"password" { send "westos\r"}
}
expect eof
EOF
}
for NUM in {1..10}
do
ping -c1 -w1 172.25.254.$NUM &> /dev/null
if [ "$?" = "0" ]
then
echo "`Auto_Connect 172.25.254.$NUM hostname | tail -n 1` A 172.25.254.$NUM">> /mnt/host_list
fi
done
sed 's/^M//g' -i /mnt/host_list
}
^M : ctrl+v ctrl+M