循环执行脚本

今天来分享一下最近学习脚本中的循环脚本心得和简易编程。

一.编程中的逻辑处理:

  • 顺序执行
  • 选择执行
  • 循环执行

1. for循环

for 变量名 in 列表;do
  循环体
done
循环执行脚本
for循环的列表生成方法
循环执行脚本
如下:
in后列表有几个既循环赋值给i几次 循环执行几次
循环执行脚本
seq 正反跳步生成列表
循环执行脚本
双引号会把参数变为一个整体
循环执行脚本
"$* " 会变为一个整体参数 既abc
"$@" 会分辨显示参数 既 a b c
小心使用即可

来看看具体使用情况及脚本吧

  1. 100以内的奇数累加循环执行脚本
  2. 既对2取模 余1就执行+=命令
    
    #!/bin/bash
    declare -i sum=0
    for i in {1..100};do
    if [ $[i%2] -eq 1 ];then
    let sum+=i
    fi
    done
    echo sum=$sum```
  3. 创建10个用户随机生成口令并下次登录更改密码
    循环执行脚本
    #!/bin/bash
    for i in {1..10};do
    useradd user$i
    password=`tr -dc '[:alnum:]' < /dev/urandom |head -c 8`
    echo user$i:$password | tee  -a pass.txt |chpasswd
    passwd  -e  user$i 
    echo "User:user$i is created"
    done

    4.提取用户名并批量删除用户
    循环执行脚本
    5.扫描网络,找出能联通的IP 并保存在文件中
    循环执行脚本
    NETID=172.16.128

    
    #!/bin/bash
    for HOSTID in {1..254};do
    {
    if ping -c1 -W1 $NETID.$HOSTID &> /dev/null ;then
    echo $NETID.$HOSTID is up | tee -a hostlist.txt
    fi
    } & 
    done
    wait```

2.for 循环的第二种写法

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
循环执行脚本
如上图,由表达式1 来和表达式二判断,如为真就执行命令 ,在再表达式3的生成下再与表达式二判断,直到与表达式二条件不满足 ,循环停止
看看例子吧:
循环执行脚本
这个是九九乘法口诀的表示图 效果图如下
循环执行脚本
#!/bin/bash<br/>for ((i=1;i&lt;=9;i++));do<br/>for((j=1;j&lt;=i;j++));do<br/>echo -e "${j}x$i=$[j*i]\t\c"<br/>done<br/>echo <br/>done
for 的两种方法表示99乘法表
循环执行脚本

3.while循环

while CONDITION; do
  循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
1.取10个随机数字 取出最大值和最小值
循环执行脚本
```#!/bin/bash
i=1
MAX=$RANDOM
MIN=$MAX
echo $MAX
while [ $i -lt 10 ];do
N=$RANDOM
echo $N
if [ $N -gt $MAX ];then
MAX=$N
elif [ $N -lt $MIN ];then
MIN=$N
fi
let i++
done
echo MAX=$MAX, MIN=$MIN


2. 监控服务的启动状态、如果关闭则重新服务
![](https://s1.51cto.com/images/blog/201906/18/6257148a3ab81965bbf3f55629e25ecb.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
每10秒监控一次,并生成日志文件
```SLEEPTIME=10
while :;do
if ! killall -0 php-fpm &&gt; /dev/null;then
systemctl restart php-fpm &&gt; /dev/null
echo "At `date +'%F %T'` php-fpm is restarted" &gt;&gt; /var/log/monitor.log
fi
sleep $SLEEPTIME
done```

4.循环控制语句continue

用于循环体中
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层
循环执行脚本
continue 中断循环中某一次循环 continue2 终端上一层循环
循环执行脚本

5.循环控制语句break

用于循环体中
break [N]:提前结束第N层循环,最内层为第1层
循环执行脚本
同理,break2 中断第二层循环
循环执行脚本

6.接下来找几个有趣的例子;

  1. 数字猜猜猜
    循环执行脚本
    
    #!/bin/bash
    N=$[RANDOM%10+1]
    while read -p "input a number(1-10):" NUM ;do
    if [[ $NUM =~ ^[[:digit:]]+$ ]];then
    if [ $NUM -eq $N ];then
    echo OK
    break
    elif [ $NUM -gt $N ];then
    echo too large!
    else
    echo too small!
    fi
    else
    echo "Please input a digit"
    fi
    done```
  2. 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?
    #!/bin/bash<br/>sum=1<br/>for i in {1..9};do<br/>let sum=(sum+1)*2<br/>done<br/>echo "num is : $sum "
    循环执行脚本
  3. 打印等腰三角形

``` #!/bin/bash
read -p "place input isoceles triangle:" line
for i in $(seq 1 $line);do
spacenum=$[line-i]
anum=$[2i-1]
for j in $(seq 1 $spacenum);do
echo -e " \c"
done
for k in $(seq 1 $anum);do
echo -e "
\c"
done
echo
done



4. 扫描网络中有多少主机是开启,有多少主机是关闭

``` #!/bin/sh
read -p "please input new(eg:192.168.0.0): " net
netid=`echo $net|cut -d. -f1-2`
i=0
up=0
down=0
while [ $i -le 254 ];do
                j=1
                while [ $j -le 254 ];do
                                if ping -c1 -w1 $netid.$i.$j &>/dev/null;then
                                                echo "the $netid.$i.$j is up"
                                                let up++
                                else
                                                echo "the $netid.$i.$j is down"
                                                let down++
                                fi
                                let j++
                done
                let i++
done
echo "the up is $up"
echo "the down is $down"```
5. 实现打印国际象棋棋盘

```#!/bin/bash
i=1
while [ $i -le 8 ];do
    j=1
    while [ $j -le 4 ];do
        if [ $[$i%2] -eq 0 ];then
            echo -e "\e[1;41m  \e[0m\e[1;43m  \e[0m\c"
        else
            echo -e "\e[1;43m  \e[0m\e[1;41m  \e[0m\c"
        fi
        let j++
    done
    echo
    let i++
done```

for 的循环写法

``` #!/bin/bash
for i in {1..8};do
    for j in {1..4};do
        if [ $[i%2] -eq 0 ];then
            echo -e "\e[1;41m  \e[0m\e[1;43m  \e[0m\c"
        else
            echo -e "\e[1;43m  \e[0m\e[1;41m  \e[0m\c"                                                                                                                     
        fi
    done
    echo
done```

## 二.函数

函数由两部分组成:函数名和函数体
help function
语法一:
f_name (){
...函数体...
}
语法二:
function f_name {
...函数体...
}
语法三:
function f_name () {
...函数体...
}
通常用第三种方法定义,比较清楚明了
函数获取操作系统版本

   func_os_version(){
    sed -nr 's/.* ([0-9]+)\..*/\1/p' /etc/redhat-release
}

#### 删除shell函数
命令格式为:

unset function_name
示例:
unset findit
再键入set命令,函数将不再显示
环境函数
使子进程也可使用
声明:export -f function_name
查看:export -f 或 declare -xf

#### 通常在较本中常用函数会放在单独文件中
使用时可以调用函数库
函数文件已创建好后,要将它载入shell
定位函数文件并载入shell的格式
. filename 或 source filename
注意:此即<点> <空格> <文件名>
这里的文件名要带正确路径

判断是否是数字的shell函数

```func_is_digit(){
    if [ ! "$1" ];then
        echo "Usage:func_is_digit number"
        return  10 
    elif [[ $1 =~ ^[[:digit:]]+$ ]];then
        return 0
    else
        echo "Not a digit"
        return 1
    fi
}```

## 今天就分享到这里了 谢谢咯

转载于:https://blog.51cto.com/14322554/2410511

猜你喜欢

转载自blog.csdn.net/weixin_34163741/article/details/93036175