bash for循环写法

我与影子孤独终老i 提交于 2020-02-17 09:34:48

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

练习

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"

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

本人微信:xiaoshitou5854

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!