一、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