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
来源:https://www.cnblogs.com/xiaoshiwang/p/12320266.html