重复
shell中的重复重要有for,while,untile,select
for
1、列表for重复
for VARIABLE in (list)
do
command
done
例:重复打印john爱好的水果
for fruit in apple orange banana pear
do
echo "$fruit is John"s favorite"
done
echo "No more fruits."
注意:
in里面可以是任意命令的尺度输出
如:
fruits="apple orange banana pear"
seq 1 2 100 #发生1到100的奇数数列
ls
1..5 #表现1 2 3 4 5
#!/bin/bash
echo "变量作为in的参数"
fruits="apple orange pear"
for fruit in ${fruits}
do
echo $fruit
done
echo "序列作为in的参数"
for var in 1 2 3 4 5
do
echo $var
done
echo "seq发生的序列作为in的参数"
#declare -i total=0
total=0
for var in $(seq 1 2 100)
do
#total+=$var
#(( total += var )) #注意算数运算的写法,一共三种写法都可以实现赋值
let "total+=var"
done
echo "1+3+5+...+99 is $total"
echo "ls的成果作为in的参数"
for var in $(ls)
do
ls -l $var
done
2、不带列表的for重复
for variable
do
command
done
注意:应用不带列表的for,须要在运行脚本时通过参数的方法给for传递变量值
#for.sh
#!/bin/bash
for var
do
echo $var
done
# . ./for.sh 1 2 3
可读性差,可以应用$@实现上面的功效
改良:
#!/bin/bash
for var in $@
do
echo $var
done
3、类Cfor重复
for ((expression ;expression2; expression3))
do
command
done
例:
#!/bin/bash
for (( i=0; i<10; i++ )) #这里没有甚么空格的请求,为了雅观,应用空格
do
echo -n "$i "
done
4、for的无穷重复
for((;1;))
do
echo
done
while
while expression
do
command
done
例:
1、#输出1到10的数字序列
#!/bin/bash
declare -i count=0
while [[ $count -lt 10 ]]
do
echo "$count"
count+=1
done
2、#求1-100之和
#求1-100之间奇数之和
#!/bin/bash
declare -i sum01=0
declare -i sum02=0
declare -i i=1
declare -i j=1
while [[ i -le 100 ]]
do
sum01+=i;
j=i%2;
#if [[ $(( i%2 )) -ne 0 ]];then
if [[ j -ne 0 ]];then
sum02+=i;
fi
((i++));#这里不可一写$((i++))
done
echo $sum01
echo $sum02
3、#猜数字
#!/bin/bash
num=8
echo "Input a number in 1 to 10:"
#领会read的用法
while read guass
do
if [[ $guass -eq $num ]];then
echo "Right."
break
else
echo "Wrong.Try Again"
fi
done
4、按行读取文件
cat student_info.txt
John 30 Boy
Sue 28 Girl
Wang 25 Boy
Xu 23 Girl
解法一:
#!/bin/bash
while read line
do
name=`echo $line | cut -d " " -f1` #echo输出line以后Tab会变成空格,所以应用cut的时候须要指定分割符(-d " ")
age=`echo $line | cut -d " " -f2` #也能够应用awk awk "{print $n}",awk的分割符是空格(" ")或Tab
sex=`echo $line | cut -d " " -f3`
echo "My name is $name,I"m $age years old,I"m a $sex"
done < student_info.txt
注意:全部思路是清楚的,重点是怎样读取文件,选用甚么命令处置行。比拟而言,脚本比编纂一个高等语言程序要简练很多
解法二:
#!/bin/bash
cat student_info.txt | while read line
do
name=`echo $line | cut -d " " -f1`
age=`echo $line | cut -d " " -f2`
sex=`echo $line | cut -d " " -f3`
echo "My name is $name,I"m $age years old,I"m a $sex"
done
两种解法功效雷同,但是有细微差异。应用重定向的while只会发生一个shell,而应用管道的脚本在运行时会发生3个shell,第一个shell是cat(运行很快,致使没法应用ps命令抓到),第二个shell是管道,第三个shell是while
5、无穷重复
#办法一
while ((1))
do
command
done
#办法二
while true
do
command
done
#办法三
while :
do
command
done
例:检测体系过程,
#!/bin/bash
while true
do
ATD_STATUS=`service atd status | grep running`
if [[ -z "$ATD_STATUS" ]];then
echo "ATD is stopped , try to restart."
service atd restart #在脚本中,如果不须要命令的返回值,则直接写命令便可,而不须要用$()命令调换
else
echo "ATD is running,wait 5 sec until next check"
fi
sleep 5 #延迟函数,单位是秒(s)
done
until
构造:
until expression
do
command
done
描写:
运行前测试,测试成果为false时持续履行,为true时退出
例:
#应用until盘算1到100的和和1-100的奇数和
#!/bin/bash
declare -i sum01=0
declare -i sum02=0
declare -i i=0
until [[ i -gt 100 ]]
do
sum01+=i
if [[ $[i%2] -ne 0 ]];then
sum02+=i
fi
((i++));
done
echo "sum01=$sum01"
echo "sum02=$sum02"
until的无穷重复
until ((0))
do
command
done
until false
do
command
done
select重复
构造:
select Menu in (list)
do
command
done
描写:
菜单扩大重复方法,语法和带列表的for重复非常相似
例:
1、断定用户的选择
#!/bin/bash
echo "Which car do you prefer?"
select car in Benz Audi VolksWagen
do
break #注意这个break,没有这个会一直处于选择状况
done
echo "You chose $car"
注解:select有断定用户输入的功效,所以select常常和case语句合并应用,
2、结合应用select和case
#!/bin/bash
select var in Mon Tue Wed Thu Fri Sat Sun
do
case $var in #case是不须要break语句的
Mon)
echo "Today is Monday"
break ;;
Tue)
echo "Today is Tuesday"
break;;
Wed)
echo "Today is Wednesday"
break ;;
Thu)
echo "Today is Thursday"
break ;;
Fri)
echo "Today is Friday"
break ;;
Sat|Sun)
echo "You can have a rest day"
break;;
*)
echo "Unknown input.Try again" ;;
esac
done
嵌套重复
例:打印九九乘法表
#!/bin/bash
declare -i i=1;
declare -i j=1;
declare -i k=0
for (( i = 1; i <= 9; i++ ))
do
for (( j = 1; j <= i; j++ ))
do
k=$i+$j
#let "k=i+j"
echo -ne $j"*"$i"="$k"\t"
#echo -ne $j"*"$i"="$(($i+$j))"\t"
#echo -ne $j"*"$i"="$[$j*$i]"\t"
#这里看到了多种表达式求值
done
echo
done
注意:
1、for的类C写法,不须要$符号,也不须要应用-le之类的
2、echo输出制表符,须要应用-e参数,这表现有转义字符时转义。没有-e会原样输出而不说明转义字符
3、表达式求值
4、自行改编成其他重复版本的九九乘法表
扩大:应用sed和awk输出九九乘法表
#!/bin/bash
seq 9 |sed "H;g"|awk -v RS="" "{
for(i=1;i<=NF;i++){
j=i*NR;
printf("%d*%d=%d\t",i,NR,i*NR);
}
printf("\n");
}"
重复掌握
break
continue
不做详细介绍,跟高等语言一样,唯一的区分是break,continue后面可以接数字,表现跳出嵌套层数,和Java中的标签相似。
例:打印素数
解法一:
#!/bin/bash
declare -i i=1
declare -i j=2
for (( i = 1; i < 100 ; i++ ))
do
for (( j = 2; j < i ;j++ ))
do
if ! (($i%$j));then #注意! 和(())扩大运算之间有空格
break;
fi
done
if [[ $j -eq $i ]];then
echo -ne "$i\t"
fi
done
echo
解法二:
#!/bin/bash
declare -i i=1
declare -i j=2
for (( i = 1; i < 100 ; i++ ))
do
for (( j = 2; j < i ;j++ ))
do
if ! (($i%$j));then #注意! 和(())扩大运算之间有空格
continue 2; #continue后面的数字表现跳出的嵌套数
fi
done
if [[ $j -eq $i ]];then
echo -ne "$i\t"
fi
done
echo
重复
shell中的重复重要有for,while,untile,select
for