05Shell loop

loop statement

for

Grammatical structures

for 变量名 [ in 取值列表 ]
do
循环体
done 

注意 When the contents of the file for progressive treatment, ignores blank lines

Examples

Example 1

ping host scripting (original version): Disadvantages slow implementation process, Ctrl + C can only be the end of a cycle, not the end of the script

[root@hadoop04 shell_for]# vim ping.sh 
#!/usr/bin/bash
##########################################
# ping test                              #
# v1.0 by ElegantSmile 9/12/2019         #
##########################################


reset_col="\e[0m"
red_col="\e[31m"
green_col="\e[32m"

# 通过输出重定向,在ping之前清理ip_up.txt和ip_down.txt的内容
>ip_up.txt
>ip_down.txt

# 产生序列有两种方式
# {n..m}
# `seq n m`
# n<m
for i in `seq 200`
for i in `seq 200`
do
        ip=172.22.34.${i}
        ping -c1 -W1 ${ip} &> /dev/null
        if [ $? -eq 0 ];then
                echo -e "${green_col}${ip} is up${reset_col}" | tee -a ip_up.txt
        else
                echo -e "${red_col}${ip} is down${reset_col}" | tee -a ip_down.txt
        fi
done

Example 2

ping host scripting (improved version): each cycle into a sub-shell execution, can greatly speed up the execution of the script

注意 1. Place the loop into the background {} & 2.wait 3. execute clean up the contents of the file before the script

[root@hadoop04 shell_for]# vim ping01.sh 
#!/usr/bin/bash
##########################################
# ping test                              #
# v1.1 by ElegantSmile 9/12/2019         #
##########################################

# 通过输出重定向,在ping之前清理ip_up.txt和ip_down.txt的内容
>ip_up.txt
>ip_down.txt

reset_col="\e[0m"
red_col="\e[31m"
green_col="\e[32m"


for i in `seq 100 200`
do
        # 将循环放到后台进程执行
        {
        ip=172.22.34.${i}
        ping -c1 -W1 ${ip} &> /dev/null
        if [ $? -eq 0 ];then
                echo -e "${green_col}${ip} is up${reset_col}" | tee -a ip_up.txt
        else
                echo -e "${red_col}${ip} is down${reset_col}" | tee -a ip_down.txt
        fi
        }&
done

#等待前面的所有后台进程结束
wait

echo "finish..."

Two versions of the script execution time comparison

Improved version

[root@hadoop04 shell_for]# time bash ping01.sh 
(略)
finish...

real    0m1.208s
user    0m0.338s
sys 0m0.781s

The initial version

[root@hadoop04 shell_for]# time bash ping.sh 
(略)

real    2m16.459s
user    0m0.277s
sys 0m0.677s

Example 3

ping the specified host

# 指定主机的IP地址
[root@hadoop04 shell_for]# vim ip.txt
172.22.34.18
172.22.34.89
172.22.34.56
172.22.34.192
172.22.34.94
172.22.34.243

# 编写脚本
[root@hadoop04 shell_for]# vim ping02.sh
#!/usr/bin/bash
##########################################
# ping test                              #
# v1.2 by ElegantSmile 9/12/2019         #
##########################################

ip_txt=$1

reset_col="\e[0m"
red_col="\e[31m"
green_col="\e[32m"


for ip in `cat ${ip_txt}`
do
        {
        ping -c1 ${ip} &> /dev/null
        if [ $? -eq 0 ];then
                echo -e "${green_col}${ip} is up${reset_col}"
        else
                echo -e "${red_col}${ip} is down${reset_col}"
        fi
        }&
done

wait

echo "finish..."

# 执行脚本
[root@hadoop04 shell_for]# time bash ping02.sh ip.txt 
172.22.34.18 is up
172.22.34.56 is down
172.22.34.192 is down
172.22.34.94 is down
172.22.34.243 is down
172.22.34.89 is down
finish...

real    0m3.018s
user    0m0.008s
sys 0m0.017s

Example 4

Create a user, enter the prefix code number; confirm the information entered; presence or absence of the user, or create a user prompt already exists

[root@hadoop04 shell_for]# vim create_user01.sh
!/usr/bin/bash
##########################################
# add user                               #
# v1.0 by ElegantSmile 9/12/2019         #
##########################################


while :
do
        read -p "Please enter prefix & password & num[tianyun 123 5]" prefix pass num

        printf "user information:
        --------------------------
        user prefix: ${prefix}
        user password: ${pass}
        user number: ${num}
        --------------------------
        "

        read -p "Are you sure?[y|n]: " action

        if [ "${action}" = "y" ];then
                break
        fi
done

# seq -w 等位补齐
for i in `seq -w ${num}`
do
        username=${prefix}${i}
        id ${username} &> /dev/null
        if [ $? -eq 0 ];then
                echo "user ${username} already exists"
        else
                useradd ${username}
                echo "${pass}" | passwd --stdin ${username} &> /dev/null
                if [ $? -eq 0 ];then
                        echo "user ${username} is created"
                fi
        fi
done

Example 5

Create a user, specify the file to be created by the user and password

# 编辑用户信息文件user.txt
[root@hadoop04 shell_for]# vim user.txt 
alice  123123
jeve   7dsgf9

# 编写脚本
[root@hadoop04 shell_for]# vim create_user02.sh
#!/usr/bin/bash
##########################################
# add user                               #
# v1.1 by ElegantSmile 10/12/2019        #
##########################################


# 执行脚本时,必须传入一个参数
if [ $# -eq 0 ];then
        echo "usage: `basename $0` file"
        exit 1
fi

# 执行脚本时,必须传入一个参数
if [ $# -eq 0 ];then
        echo "usage: `basename $0` file"
        exit 1
fi

# 执行脚本时,传入的参数必须是文件
if [ ! -f $1 ];then
        echo "error file"
        exit 2
fi

# 定义变量
user_text=$1

#IFS 内部字段分隔符
 IFS=$'\n'

for line in `cat "${user_text}"`
do
        # 获取指定用户的用户名和密码
        username=`echo "${line}" | awk '{print $1}'`
        userpass=`echo "${line}" | awk '{print $2}'`
        id ${username} &> /dev/null
        if [ $? -eq 0 ];then
                echo "user ${username} already exists"
                continue
        fi
        useradd ${username} &> /dev/null && echo "${userpass}" | passwd --stdin ${username} &> /dev/null
        if [ $? -eq 0 ];then
                echo "user ${username} is created"
                echo "userpassword: ${userpass}"
        fi
done

Example 6

Batch Change password

while

Grammatical structures

while 条件测试
do
循环体
done
==当条件测试成立(条件测试为`真`),执行循环体  

注意

☆☆☆ When you need the file content line by line treatment is recommended:

while read line

do

循环体

done < FILE

Examples

Example 1

Create a user, create a user through a user list file

# 编辑用户信息文件user.txt
[root@hadoop04 shell_while]# vim user.txt 
alice  123123
jeve   7dsgf9

# 编写脚本
[root@hadoop04 shell_while]# vim create_user01.sh

#!/usr/bin/bash
##########################################
# add user                               #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

while read userinfo
do
        if [ ${#userinfo} -eq 0 ] ;then
                echo "Nothing to do"
                continue
        fi
        username=`echo "${userinfo}" | awk '{print $1}'`
        userpass=`echo "${userinfo}" | awk '{print $2}'`
        id "${username}" &> /dev/null
        if [ $? -eq 0 ];then
                echo "user ${username} already exists"        else    
                useradd ${username} &> /dev/null && echo "${userpass}" | passwd --stdin ${username} &> /dev/null
                if [ $? -eq 0 ];then
                        echo "user ${username} is created"
                        echo "userpassword: ${userpass}"
                        echo "username: ${username}"
                fi      
        fi

done < user.txt

echo "all ok..."

until

Grammatical structures

until 条件测试
do
循环体
done
==当条件测试成立(条件测试为`假`),执行循环体  

Examples

ping a host, check IP status

# while循环
# ip ping不通时提示
# 类似于下线提示
[root@hadoop04 shell_until]# vim ping01.sh 
#!/usr/bin/bash
##########################################
# ping hosts                             #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

ip=$1

while ping -c1 -W1 ${ip}&> /dev/null:
do
        sleep 1
done

echo "${ip} is down"


# until循环
# ip ping得通时提示
# 类似于上线提示
[root@hadoop04 shell_until]# vim ping02.sh 
#!/usr/bin/bash
##########################################
# ping hosts                             #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

ip=$1

until ping -c1 -W1 ${ip}&> /dev/null:
do
        sleep 1
done

echo "${ip} is up"

For While Until对比

循环次数固定的  --> for

循环次数不固定的  --> while until

对文件逐行处理  --> while

ping host probe

Fixed number of cycles to detect ping host

For

[root@hadoop04 shell_for_while_until]# vim for_while_until_ping.sh 
#!/usr/bin/bash
##########################################
# ping hosts                             #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

for i in {2..254}
do
    {
    ip=172.22.145.${i}
    ping -c1 -W1 ${ip} &> /dev/null
    if [ $? -eq 0 ];then
        echo "${ip} is up"  
    fi
    } &
done

wait

echo "all finish..."

While

[root@hadoop04 shell_for_while_until]# vim while_until_for_ping.sh 
#!/usr/bin/bash
##########################################
# ping hosts                             #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

i=2

while [ $i -le 254 ]
do
    {
    ip=172.22.145.${i}
    ping -c1 -W1 ${ip} &> /dev/null
    if [ $? -eq 0 ];then
        echo "${ip} is up"  
    fi
    } &
    let i++
done

wait

echo "all finish..."

Until

[root@hadoop04 shell_for_while_until]# vim until_for_while_ping.sh 
#!/usr/bin/bash
##########################################
# ping hosts                             #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

i=2

until [ $i -gt 254 ]
do
    {
    ip=172.22.145.${i}
    ping -c1 -W1 ${ip} &> /dev/null
    if [ $? -eq 0 ];then
        echo "${ip} is up"  
    fi
    } &
    let i++
done

wait

echo "all finish..."

1-100 and computing

For

[root@hadoop04 shell_for_while_until]# vim for_while_until_sum100.sh
#!/usr/bin/bash
##########################################
# sum 100                                #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################


for i in {1..100}
do
        #let sum=${sum}+${i}
        let sum+=${i}
done

echo "sum: ${sum}"

While

[root@hadoop04 shell_for_while_until]# vim while_until_for_sum100.sh
#!/usr/bin/bash
##########################################
# sum 100                                #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

i=1

while [ ${i} -le 100 ]
do
        #let sum=${sum}+${i}
        let sum+=${i}
        let i++
done

echo "sum: ${sum}"

Until

[root@hadoop04 shell_for_while_until]# vim until_for_while_sum100.sh
#!/usr/bin/bash
##########################################
# sum 100                                #
# v1.0 by ElegantSmile 10/12/2019        #
##########################################

i=1

until [ ${i} -gt 100 ]
do
        #let sum=${sum}+${i}
        let sum+=${i}
        let i++
done

echo "sum: ${sum}"

Guess you like

Origin www.cnblogs.com/ElegantSmile/p/12056477.html