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"