一:常用格式
格式一
for 变量
do
语句
done
格式二
for 变量 in 列表
do
语句
done
格式三
for ((变量=初始值; 条件判断; 变量变化))
do
语句
done
二:实例
1.数字段形式
for i in {1..10}
do
echo $i
done
结果:
[root@lb02 ~]# sh .sh......
2.详细列出(字符且项数不多)
for ma in 1 2 3
do
echo $ma
done
结果:
[root@lb02 ~]# sh .sh
3.对存在的文件进行循环
for shname in `ls *.sh` #此处为反引号,是为了解析其中的命令,反引号也可换成$()。in 后还可以接能获得多个值的命令,也可以接变量和数组。只要
do #返回值为数组形式即可
name=`echo "$shname" | awk -F. '{print $1}'`
echo $name
done
结果:
[root@lb02 ~]# ls
.sh .sh .sh .sh anaconda-ks.cfg mydir
[root@lb02 ~]# sh .sh
4.查找循环(ls数据量太大的时候也可以用这种方法)
for shname in `find . -type f -name "*.sh"`
do
name=`echo "$shname" | awk -F/ '{print $2}'`
echo $name
done
结果:
[root@lb02 ~]# ls
.sh .sh .sh .sh .sh anaconda-ks.cfg mydir
[root@lb02 ~]# sh .sh
.sh
.sh
.sh
.sh
.sh
5.语法循环–有点像C语法,但记得双括号
for((i=1;i<10;i++))
do
if((i%3==0))
then
echo $i
continue
fi
done
结果:
[root@lb02 ~]# sh .sh
6.seq形式 起始从1开始
for i in `seq 10`
do
if((i%3==0))
then
echo $i
continue
fi
done
结果:
[root@lb02 ~]# sh .sh
7.遍历数组
array=(a b c)
for data in ${array[@]}
do
echo ${data}
done
结果:
[root@lb02 ~]# sh array.sh
a
b
c
8.从其它文件中获取内容
a=$(cat ~/myfile) #此处也可以用相对路径
for i in $a
do
echo $i
done
[root@lb02 ~]# cat myfile
a
b
c
结果:
[root@lb02 ~]# sh .sh
a
b
c
9.求等差数列的和
sum=0
for i in {1..6..2} #也可以用for i in $(seq 1 2 6),seq表示起始数为1,跳跃的步数为2,结束条件值为6。
do
let "sum+=i" #let不可省
done
echo "sum=$sum"
结果:
[root@lb02 ~]# sh .sh
sum=
10.awk中用for循环
[root@lb02 ~]# awk 'BEGIN{for(i=1; i<=5; i++) print i}'
1
2
3
4
5
11.对每个传参进行操作
for i in "$@" #$#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。
do
echo "$i"
done
结果:
[root@lb02 ~]# sh .sh
12.类C的for循环计算1~6内所有的奇数之和
sum=0
for(( i = 1; i <= 6; i = i + 2 ))
do
let "sum += i"
done
echo "sum=$sum"
结果:
[root@lb02 ~]# sh .sh
sum=
13.还可以在命令行这样写
[root@lb02 ~]# for ((i=0; i<3; ++i))
> do
> echo $i
> done
0
1
2
[root@lb02 ~]# for ((i=0; i<3; i++)); do echo $i; done
0
1
2
[root@lb02 ~]# print_args()
> {
> for arg in "$@"
> do
> echo $arg
> done
> }
[root@lb02 ~]# print_args 1 2 3 4
1
2
3
4
[root@lb02 ~]# print_args "wo shi machangwei"
wo shi machangwei
[root@lb02 ~]# print_args wo shi machangwei
wo
shi
machangwei
14.shell实现类似Python键值对来获取值
num=(1 2 3 4)
str=(a b c d)
num_of_num=${#str[@]}
str_num_of()
{
for ((i=0; i<$num_of_num; ++i))
do
if [ "$1" == "${num[i]}" ]; then
echo "${str[i]}"
fi
done
}
echo $(str_num_of 2)
for i in ${num[*]}
do
echo $i $(str_num_of $i)
done
结果:
[root@lb02 ~]# sh .sh
b
a
b
c
d
15、for中{}可以内容也可以打印出来
[root@lb02 ~]# for i in "{1..5}"; do echo $i; done
{1..5}
16、shell计数器
n=0
for i in a b c
do
n=`echo ${n} + 1|bc`
echo $n
done
结果:
[root@db01 ~]# sh jishu
sum=0
for(( i = 1; i <= 4; i++ ))
do
let "sum += i"
echo $i
done
echo "sum=$sum"
echo $i
结果:
[root@lb02 ~]# sh ss 4 #内部计数:
sum=10 #求和
5 #在for外层,为最大i加1的结果,相当于再循环一次
17、往数组里添加元素。将for循环的变量变成键值的形式,在最外层也能以键值对来取用。
a=() #初始化数组
num=0 #计数器初始值
for con in a b c #定义数组元素
do
a[${num}]=$con #将每个变量形成有角标的数组元素
num=`echo ${num} + 1|bc` #计数器
done
echo ${a[@]} #显示数组a的全部元素
echo ${a[1]} #显示数组a的第二个元素
结果:
[root@db01 ~]# sh jishu
a b c
b
18、for变量范围中有其他变量。
a=`echo abcde|wc -L` #此处数字变量也可由ls等得出
for i in `seq 2 $a` #此处不可以用{}的形式
do
echo $i
done
结果:
[root@db01 ~]# sh jishu
19、shell实现多线程并发执行
start=`date +%s`
for i in {1..10}
do
{
sleep 1 #实际应为10秒,因为启用多线程,所以1秒结束。但是这样对cpu的消耗比较大。
echo $i;
} & #将执行的命令放在后台执行
done
wait #等待所以子进程结束
stop=`date +%s`echo 总共花费时长:$((${stop}-${start}))
结果:
[root@db01 ma]# sh .sh 总共花费时长:
问题:
1. 怎么用for实现死循环(无限循环)?
2. 比较几种写法的不同:(1) for arg in $* (2) for arg in $@ (3) for arg in “$*” (4) for arg in “$@”
3. 怎么跳出for循环?