bash 循环写法

for

依次访问列表里的元素。

由空格或回车分隔的串就是列表。

for var in 列表 ; do
    
done

列表的生成方式

  • 直接写:

    for num in 1 2 3 4 5 6 ist in ; do
        
    done
    for username in us1 us2 us3 ist in ; do
        
    done
    
  • 展开

    for num in {1..2}; do
        echo $num
    done
    
  • 使用seq命令生成

    seq [OPTION]... LAST
    seq [OPTION]... FIRST LAST
    seq [OPTION]... FIRST INCREMENT LAST
    

    FIRST:起始

    INCREMENT:步长

    LAST:结尾

    例子:

    # seq 2
    1
    2
    # seq 3
    1
    2
    3
    # seq 2 4
    2
    3
    4
    # seq 2 3 9
    2
    5
    8
    
    for n1 in `seq 20 22`; do
        echo -n "$n1"
    done
    
  • 命令的返回值是列表

    ls,cat命令的返回值都是列

    for var in `ls /root`; do
        echo $var
    done
    
    for var in `cat /etc/fstab `; do
        echo $var
    done
    
  • glob也能返回列表

    for var in /etc/pu*; do
        echo $var
    done
    
  • 变量引用:$@,$*

    name=/etc/pu*
    name=`ls -d /etc/p*`
    name=`cat /etc/fstab`
    for var in $name; do
        echo $var
    done
    

for练习

1,分别求100以内所有偶数之和,所有奇数之和

#!/bin/bash

declare -i sum1=0
declare -i sum2=0

for var in {1..100}; do
    if [ $[var % 2] -eq 0 ]; then
        sum1=$[$sum1+$var]
    else
        sum2=$[$sum2+$var]
    fi
done
echo $sum1,$sum2

2,计算当前系统上的所有用户的id之和

#!/bin/bash

declare -i sum=0

for var in `cat /etc/passwd | cut -d: -f3`; do
    sum=$[$sum+$var]
done
echo $sum

3,参数是一个目录,计算此目录下所有文本文件的行数之和,并有多少文本文件

#!/bin/bash

declare -i sum=0
declare -i lines=0

#在参数1后面加了/*,也就是取得给定目录下的所有文件
for var in $1/*; do
#file命令的返回值,如果是文本文件,则返回值里有字符串ASCII
#如果是可执行文件,则返回值里有字符串ELF
    if [[ `file $var` =~ ASCII ]]; then
        sum=$[$sum+1]
        #wc -l得到文本文件的行数,使用了重定向
        lines=$[$lines+$[`wc -l < $var`]]
    fi
done

echo "ascii lines is: $lines"
echo "acsii file's number is $sum"

emacs 生成for代码块的快捷键:c-c c-f

特殊用法:for ((i=0;i<=100;i++)); do

#!/bin/bash
#

declare -i sum=0
for ((i=0;i<=100;i++)); do
    let sum+=$i
done
echo $sum

while

语法:

条件为真则进入循环体。

while condition; do

done

例子:求1到100的整数之和。

#!/bin/bash

declare -i sum=0
declare -i i=1
# -le是小于等于
while [ $i -le 100 ]; do
    let sum+=$i
    let i++
done
echo $sum

emacs 生成while代码块的快捷键:c-c c-w

特殊用法:读取文件的每一行

while read VAR; do

done < /path/from/file

例子:找出ID号为偶数的用户,显示其用户名,id和默认shell

#!/bin/bash
#
while read lines ;do
    username=`echo $lines | cut -d: -f1`
    userid=`echo $lines | cut -d: -f3`
    usershell=`echo $lines | cut -d: -f7`
    if [ $[$userid % 2] -eq 0 ]; then
        echo "userid:$userid,username:$username, shell:$usershell"
    fi
done < /etc/passwd

until

语法:

条件为假则进入循环体。

until condition; do

done

例子:求1到100的整数之和。

#!/bin/bash

declare -i sum=0
declare -i i=1

until [ $i -gt 100 ]; do
    let sum+=$i
    let i++
done
echo $sum

循环控制

  • continue:结束本次循环
  • break:结束整个循环

emacs 生成while代码块的快捷键:c-c c-u

练习:分别使用for,while,until实现

1,分别求100以内所以偶数之和,100以内所以奇数之和

  • for实现:

    #!/bin/bash
    
    declare -i sum=0
    for i in `seq 0 2 100` ; do
        let sum+=i
    done
    echo $sum
    
    declare -i sum1=0
    for i in `seq 1 2 100` ; do
        let sum1+=i
    done
    echo $sum1
    
  • while实现:

    #!/bin/bash
    
    declare -i i=0
    declare -i sum=0
    while [ $i -le 100 ]; do
        let sum+=i
        let i+=2
    done
    echo $sum
    
    declare -i i1=1
    declare -i sum1=0
    while [ $i1 -le 100 ]; do
        let sum1+=i1
        let i1+=2
    done
    echo $sum1
    
  • unitl实现:

    #!/bin/bash
    
    declare -i i=0
    declare -i sum=0
    until [ $i -gt 100 ]; do
        let sum+=i
        let i+=2
    done
    echo $sum
    
    declare -i i1=1
    declare -i sum1=0
    until [ $i1 -gt 100 ]; do
        let sum1+=i1
        let i1+=2
    done
    echo $sum1
    

2,创建10个用户,user101~user110,密码同用户名

  • for实现:

    #!/bin/bash
    
    for i in {100..110} ; do
        if `id user$i &> /dev/null` ; then
            echo "user:user$i exist!"
            exit 1
        fi
        #-M选项:不创建家目录
        useradd -M "user$i" &> /dev/null && echo "user$i" | passwd --stdin "user$i" > /dev/null
    done
    
  • while实现:

    #!/bin/bash
    
    declare -i i=100
    while [ $i -le 101 ]; do
        if `id user$i &> /dev/null` ; then
            echo "user:user$i exist!"
            exit 1
        fi
    
        useradd -M "user$i" &> /dev/null && echo "user$i" | passwd --stdin "user$i" > /dev/null
        let i+=1
    done
    

3,每隔2秒检测ys用户是否登录了,如果发现其登录了,则退出循环。

#!/bin/bash
#

while [ true ]; do
    if `who | grep ays &> /dev/null`; then
        break
    fi
    sleep 2
done

echo `date +"%F %T"` ays logged on >> /tmp/userlogon.log

查看/tmp/userlogon.log

# cat /tmp/userlogon.log
2018-05-25 11:29:21 ays logged on
2018-05-25 11:29:37 ays logged on

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/12320266.html