一、if 语句
二 、for循环
正文
一、shell的if语句
1. if then
if 语句语法格式:
if condition
then
command1
command2
...
commandN
fi
2.if else
if else 语法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
3.if elif else
if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
举例子:
note:
- if 后面的中括号[ ], 跟变量之间有空格
- 多行命令在一行写,要加分号“;”
#!/bin/bash #1 NUM=13 if test $NUM!=3 then echo "$NUM" fi #2 NUM1=$[2*3] echo $NUM1 NUM2=$[4+1] echo $NUM2 if test $NUM1 -eq $NUM2 then echo "$NUM1 = $NUM2" else echo "$NUM1 != $NUM2" fi #3 a=10 b=12 if [ $a == $b ] then echo "a == b" elif [ $a -gt $b ] then echo "a > b" elif [ $a -lt $b ] then echo "a < b" fi #4 # One line the ";" is needed! c=2;d=3 if [ $c -le $d ];then echo "c<d";fi
二、for 循环
例1: for i in 格式的循环
#!/bin/bash #1for的直接赋值 for var in 1 2 3 4 5 6 do echo -n -e $var sleep 1 done #2for的命令赋值 for var in `seq 1 9` do echo $var done #3赋值是一个字符串,it's my bag, not his read -p "Login: " info for var in $info do echo $var done for var in it\'s my bag, not his do echo $var done
shell的seq:squeue 是一个序列的缩写,主要用来输出序列化的东西
用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 增量 尾数 以指定增量从首数开始打印数字到尾数。 -f, --format=格式 使用printf 样式的浮点格式 -s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n) -w, --equal-width 在列前添加0 使得宽度相同【自动补位】 --help 显示此帮助信息并退出
指定分隔符 横着输出
[root@localhost ~]# seq -s '#' 5 1#2#3#4#5
以空格作为分格,且输出单数
[root@localhost ~]# seq -s ' ' 10 1 2 3 4 5 6 7 8 9 10
默认补位操作
[root@localhost ~]# seq -w 1 5 01 02 03 04 05
产生-2~10内的整数,增量为2
[root@localhost ~]# seq -2 2 10 -2 0 2 4 6 8 10
产生98~101之间的整数,并且要求输出数字宽度相同
%3g 表示宽度为3,不足用0补足
[root@cnblogs ~]# seq -f "%03g" 98 101 098 099 100 101 [root@cnblogs ~]# seq -f "%04g" 98 101 0098 0099 0100 0101 [root@cnblogs ~]# seq -f "%05g" 98 101 00098 00099 00100 00101 [root@cnblogs ~]#
% 前面还可以指定字符串
一次性创建5个名为dir001 , dir002 .. dir005 的目录
[root@cnblogs ~]# seq -f 'dir%03g' 1 5 dir001 dir002 dir003 dir004 dir005 [root@cnblogs ~]# seq -f 'dir%03g' 1 5|xargs mkdir [root@cnblogs ~]# ls -l dir*
例2: C语言格式的for循环
双圆括号(())有计算的功能,
- 括号中的变量,条件,操作之间用分号隔开
- 括号中的内容跟前后括号要有空格
#!/bin/bash #1 for (( i=1;i<10;i++ )) do echo $i done #2 多变量 for (( n=0,m=10;m>0; n++,m-- )) do echo $m,$n done
例3 sleep N 脚本执行到该步,睡眠N秒
表示日期的:
/shell_j/sh_for$ date +%"F:%H:%M:%S"
2021-12-22:20:16:07
#!/bin/bash #1 倒计时 echo -n "倒计时: " for i in `seq 9 -1 0` do echo -n -e "\b$i" sleep 1 done echo #2 监控主机存活的脚本 # 在 shell 中我们会见到 $0、$1、$2这样的符号,这是什么意思呢? 简单来说 $0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本>传的第二个参数 for ((;;)) do ping -c1 $1 &>/dev/null if [ $? -eq 0 ] then echo "`date +%"F:%H:%M:%S"` $1 is up" else echo "`date +%"F:%H:%M:%S"` $1 is down" fi sleep 5 # 脚本节奏控制,生产环境在1分钟及以上 done
sleep 5, 对cpu的使用率基本没有影响
运行:倒计时从9-0后执行ping baidu的操作
/shell_j/sh_for$ bash for_sleep.sh www.baidu.com 倒计时:0 2021-12-22:20:26:07 www.baidu.com is up
给监控显示的log加上颜色:-e 取消转移字符
#2 监控主机存活的脚本 # 在 shell 中我们会见到 $0、$1、$2这样的符号,这是什么意思呢? 简单来说 $0 就是你写的shell脚本本身的名字,$1 是你给你写的shell脚本传的第一个参数,$2 是你给你写的shell脚本>传的第二个参数 for ((;;)) do ping -c1 $1 &>/dev/null if [ $? -eq 0 ] then echo -e "`date +%"F:%H:%M:%S"` $1 is \033[32m up \033[0m" else echo -e "`date +%"F:%H:%M:%S"` $1 is \033[31m down \033[0m" fi sleep 5 # 脚本节奏控制,生产环境在1分钟及以上 done
运行如下:
例4: for循环中的continue 和break
#!/bin/bash #1 for (( i=0;i<10;i++ )) do if [ $i -eq 6 ];then continue # 结束本次循环,进入下一次循环 fi echo $i done
echo
for (( i=10;i>0;i-- )) do if [ $i -eq 6 ];then break # 结束所有的循环 fi echo $i done
运行:
/shell_j/sh_for$ bash for_continue_break.sh 0 1 2 3 4 5 7 8 9
10 9 8 7
例5:要求用户输入密码,5次机会;输入成功直接退出;5次都没输入成功提示密码输入错误。
#!/bin/bash for (( i=0;i<5;i++ )) do read -p "Please input your password: " pwd if [ $pwd -eq "8787998" ];then echo "Login Success" break fi if [ $i -eq 4 ];then echo "You have only 5 chance! Login failed! " break fi echo "Your password is not correct, input again!" done
例6: break N 跳出循环N层循环
for循环的嵌套,从内往外数分别是1,2,3.。。。
break 1 表示跳出最内层for循环(1 表示最内层时,可省略1,直接break)
break 2 表示跳出从内向外的第二层for循环,以此类推。。。。
#!/bin/bash for (( i=1;i<10;i++ )) do echo "loop i: $i" for(( j=0;j<5;j++ )) do echo "loop j: $j" if [ $j -eq 3 ];then break elif [ $j -eq 4 ];then break 2 fi done done