二重循环

循环里面嵌套循环,外层循环先开始,内层循环结束后,再开始外层的下一个循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for i in `seq 1 5` 
do
for j in `seq 1 5`
do
echo -n "$j" #内层循环
done
echo "$i" #外层循环
done

#乘法表(双重嵌套)
for i in `seq 1 9`
do
for j in `seq 1 $i`
do
echo -n "$j*$i = $(($i*$j))"
done
echo ""
done

循环控制

只影响离自己最近的那个循环
break 跳出当前循环(如果有多重循环会继续执行上一层循环)
continue 跳出语句(不再往下执行),继续执行当前循环的下一个元素

函数

自定义函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
name(){
echo "hello 黄文哲"
}

getSum(){
sum=$(($1+$2)) #这里的$1 $2是调用函数时的位置参数
echo "$sum"
name #函数可以互相嵌套,前提是被嵌套的函数要先声明
}

#执行函数
getSum $1 $2 #这里的$1 $2是脚本的位置参数(./test.sh 1 2)

read -p "请输入数字1:" n1
read -p "请输入数字2:" n2
he=`getSum $n1 $n2` #调用函数
echo "$he"

递归(自己调用自己)

1
2
3
4
5
6
7
8
9
10
11
12
#输入一个目录显示里面的所有目录
getDir(){
names=`ls $1`
for i in $names
do
if [ -d $1/$i ]
then
echo "$1/$i"
getDir $1/$i
fi
done
}

练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#1.99乘法表 
for i in `seq 1 9`
do
for j in `seq 1 $i`
do
echo -n "$j×$i=$(($i*$j)) "
done
echo ""
done

#2.拼接一个直角三角形
for i in `seq 1 5`
do
for j in `seq 1 $i`
do
echo -n "*"
done
echo " "
done

#3.上个练习基础上拼接一个等腰三角形
for i in `seq 1 5`
do
for k in `seq 1 $((5-$i))`
do
echo -n " "
done
for j in `seq 1 $(($i*2-1))`
do
echo -n "*"
done
echo " "
done

#4.上个练习基础上拼接一个菱形
for i in `seq 1 9`
do
if [ $i -le 5 ]
then
for k in `seq 1 $((5-$i))`
do
echo -n " "
done
for j in `seq 1 $(($i*2-1))`
do
echo -n "*"
done
echo " "
else
for n in `seq 1 $(($i-5))`
do
echo -n " "
done
for m in `seq 1 $(((10-$i)*2-1))`
do
echo -n "*"
done
echo " "
fi
done

#5.打印输出100至200之间的全部素数,输出素数并统计共有多少个素数。 注:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
for i in `seq 100 200`
do
n=$(($i-1))
for j in `seq 2 $n`
do
if [ $(($i%$j)) -eq 0 ]
then break
elif [ $j -eq $n ]
then
echo "$i"
count=$(($count+1))
fi
done
done
echo "共有$count个素数"


#1.编写函数, 函数传入三个参数,输出积
getJi(){
ji=$(($1*$2*$3))
echo "$he"
}

#2.编写函数,传递一个数字参数5,实现1到5的累加,返回和,输出"和是:15"
getSum(){
for i in `seq 1 $1`
do
sum=$(($sum+$i))
done
echo "和是:$sum"
}

#3.编写函数,当该函数没有参数或参数多于2个, 输出-1,只有一个参数时, 输出1,有两个参数 时, 输出2 提示:使用$#判断参数的个数
countNum(){
if [ $# -eq 1 -o $# -eq 2 ]
then
echo "$#"
else
echo "-1"
fi
}

#4.编写函数,实现传入一个目录参数,将该目录下(递归)所有的文件都打印出来(遇到文件则打印,遇到目录则继续调函数递归)
getFile(){
names=`ls $1`
for i in $names
do
if [ -f $1/$i ]
then
echo "$1/$i"
elif [ -d $1/$i ]
then
getFile $1/$i
fi
done
}

#5.编写函数,传入一个数字n,实现n的阶乘,效果如下:
jiecheng(){
txt="$1!=$1"
res=1
for i in `seq $1 -1 1`
do
if [ $i -ne $n ]
then txt=$txt*$i
fi
res=$(($res*$i))
done

echo "根据数字$1得到阶乘表达式是:$txt=$res"
}
read -p "请输入数字:" n
jiecheng $n