目录
shell脚本部分参照:Linux Shell脚本学习指南http://c.biancheng.net/shell/
进行学习,过程中对脚本进行编写运行,部分脚本粘贴出执行结果。
while 循环
while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。
Shell while 循环的用法如下:
while condition
do
statements
done
condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。
while 循环的执行流程为:
先对 condition 进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。
每一次执行到 done 的时候都会重新判断 condition 是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。
如果一开始 condition 就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。
注意,在 while 循环体中必须有相应的语句使得 condition 越来越趋近于“不成立”,只有这样才能最终退出循环,否则 while 就成了死循环,会一直执行下去,永无休止。
案例:
#!/bin/bash
#dev by yjh
#while 的使用
printf "请输入极小值"
read m
printf "输入极大值"
read n
sum=0
while ((m<n))
do
((sum += m))
((m++))
done
echo "the sum is : $sum"
案例:累加器
#!/bin/bash
#dev by yjh
#while 的使用 "
echo "输入需要累加的数据,直累加到按Ctrl+D退出"
sum=0
while read n
do
((sum += n))
done
echo "the sum is : $sum"
shell until 循环
当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。
until 的使用场景很少,一般使用 while 即可。
Shell until 循环的用法如下:
until condition
do
statements
done
condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。
until 循环的执行流程为:
先对 condition 进行判断,如果该条件不成立,就进入循环,执行 until 循环体中的语句(do 和 done 之间的语句),这样就完成了一次循环。
每一次执行到 done 的时候都会重新判断 condition 是否成立,如果不成立,就进入下一次循环,继续执行循环体中的语句,如果成立,就结束整个 until 循环,执行 done 后面的其它 Shell 代码。
如果一开始 condition 就成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。
注意,在 until 循环体中必须有相应的语句使得 condition 越来越趋近于“成立”,只有这样才能最终退出循环,否则 until 就成了死循环,会一直执行下去,永无休止。
案例:
#!/bin/bash
#dev by yjh
#desc:until循环使用方式:先执行,再执行,在判断,再执行的过程。
echo "输入累积数据极小值"
read min
echo "输入累积数据的极大值"
read max
csum=1
until ((min > max)) #执行do done间的命令,直到满足该条件才退出
do
# echo "求积过程中${min}" 为了调试,显示执行过程用
((csum = csum * min ))
((min++))
done
echo "csum = ${csum}"
shell for 循环
for ((exp1; exp2; exp3)) 风格
for((exp1; exp2; exp3))
do
statements
done
几点说明:
exp1、exp2、exp3 是三个表达式,其中 exp2 是判断条件,for 循环根据 exp2 的结果来决定是否继续下一次循环;
statements 是循环体语句,可以有一条,也可以有多条;
do 和 done 是 Shell 中的关键字。
它的运行过程为:
1) 先执行 exp1。
2) 再执行 exp2,如果它的判断结果是成立的,则执行循环体中的语句,否则结束整个 for 循环。
3) 执行完循环体后再执行 exp3。
4) 重复执行步骤 2) 和 3),直到 exp2 的判断结果不成立,就结束循环。
上面的步骤中,2) 和 3) 合并在一起算作一次循环,会重复执行,for 语句的主要作用就是不断执行步骤 2) 和 3)。
exp1 仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。exp2 一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。exp3 很多情况下是一个带有自增或自减运算的表达式,以使循环条件逐渐变得“不成立”。
for 循环的执行过程可用下图表示:
案例:
#!/bin/bash
#dev by yjh
# 测试shell脚本的for循环
echo "请输入for循环执行次数"
read times
sum=0
for ((i=0; i<${times}; i++))
do
echo "执行第${i}次"
((sum+=${i}))
done
echo "总求和为${sum}"
exit 0
for in 风格
for in 循环的用法如下:
for variable in value_list
do
statements
done
variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。
每次循环都会从 value_list 中取出一个值赋给变量 variable,然后进入循环体(do 和 done 之间的部分),执行循环体中的 statements。直到取完 value_list 中的所有值,循环就结束了。
- 对 value_list 的说明
1) 直接给出具体的值
可以在 in 关键字后面直接给出具体的值,多个值之间以空格分隔,比如1 2 3 4 5、"abc" "390" "tom"等。
2) 给出一个取值范围
给出一个取值范围的具体格式为:
{start..end}
start 表示起始值,end 表示终止值;注意中间用两个点号相连,而不是三个点号。这种形式只支持数字和字母。
例如,计算从 1 加到 100 的和:
#!/bin/bash
#dev by yjh
#for in 应用值范围方式{start..end}
echo “求1到100的和”
sum=0
for i in {1..100}
do
((sum+=i))
done
echo “1到100的和为${sum}”
3) 使用命令的执行结果
使用反引号``或者$()都可以取得命令的执行结果,我们在《Shell变量》一节中已经进行了详细讲解,并对比了两者的优缺点。本节我们使用$()这种形式,因为它不容易产生混淆。
案例:
#!/bin/bash
#dev by yjh
#for in 应用命令结果$(exp)
echo "当前文件夹中shell脚本有"
for fileName in $(ls *.sh)
do
echo "${fileName}"
done
exit 0
4) 使用 Shell 通配符
Shell 通配符可以认为是一种精简化的正则表达式,通常用来匹配目录或者文件。
案例:
#!/bin/bash
#dev by yjh
#for in 通配符
echo "当前文件夹中shell脚本有"
for fileName in *.sh
do
echo "${fileName}"
done
exit 0
5) 使用特殊变量
Shell 中有多个特殊的变量,例如 $#、$*、$@、$?、$$ 等
案例:
#!/bin/bash
#dev by yjh
#for in 通配符
for var in $*
do
echo "${var}"
done
exit 0
Shell select in循环
Shell select in 循环的用法如下:
select variable in value_list
do
statements
done
案例:
#!/bin/bash
#dev by yjh
#select 的使用方法
echo "选择操作系统"
select os in "linux" "windows" "mac"
do
echo "操作系统为${os}"
done
exit 0
#ctrl+d 退出
案例2:
#!/bin/bash
#dev by yjh
#select 的使用方法
echo "选择操作系统"
select os in "linux" "windows" "mac"
do
case ${os} in
linux)
echo "操作系统为${os}"
break
;;
windows)
echo "操作系统是${os}"
break
;;
mac)
echo "操作系统为¥{os}"
break
;;
*)
echo "不在选项内${os}"
;;
esac
done
exit 0