(P6)shell编程入门第六讲:循环语句:for、while、until、select菜单

文章目录

    • 1.for循环
    • 2.while循环
    • 3.until循环
    • 4.select与菜单

1.for循环

  • 语法结构:
for variable in list 
# 每一次循环,依次把列表 list 中的一个值赋给循环变量
do          # 循环开始的标志
  commands  # 循环变量每取一次值,循环体就执行一遍
done        # 循环结束的标志
  • 说明:
    (1) 列表 list 可以是命令替换、变量名替换、字符串和文件名列表 ( 可包含通配符 )
    (2)for 循环执行的次数取决于列表 list 中单词的个数
    (3)for 循环体中一般要出现循环变量,但也可以不出现

  • for 循环执行过程
    执行第一轮循环时,将 list 中的第一个词赋给循环变量,并把该词从 list 中删除,然后进入循环体,执行 do 和 done 之间的命令。下一次进入循环体时,则将第二个词赋给循环变量,并把该词从 list 中删除,再往后的循环也以此类推。当 list 中的词全部被移走后,循环就结束了。

  • 位置参量的使用: $* 、 “$*” 、 $@、 “$@”

  • 可以省略 in list ,此时使用“$@”

  • eg1

#!/bin/bash
for i in 1 2 3 4 5
do
	echo value of is $i
done
  • 测试:
    (P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第1张图片
  • eg2:不带参量的eg
#!/bin/bash

##省略in list时,使用带有双引号的"$@"
for i
do
	echo value of is $i
done
  • 测试:
    (P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第2张图片

  • eg3:

#!/bin/bash

for i in $*		##测试1
for i in "$*"		##测试2
for i in $@			##测试3
for i in "$@"			##测试4
do 
	echo $i
done
  • 测试:
    测试1:
    (P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第3张图片

测试2:参量列表不会因为有双引号而有差别
(P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第4张图片
测试3:i只循环一次,只把他当作一个参量
在这里插入图片描述
测试4:$*和$@是一样的,双引号对其不起作用
(P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第5张图片

  • eg4:输出当前目录有多少个文件
#/bin/bash
count=0
## *表示通配当前文件夹底下的文件列表
for f in *
do
	counter=$[$counter+1]
done

echo There are $counter files in `pwd`
  • 测试:
    文件夹也是个文件
    (P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第6张图片
  • 类似于C语言的for 循环
for ((exp1;exp2;exp3)
do
done
  • eg:打印星号,$1表示需要打印星号的总行数
#!/bin/bash

if [ $# -ne 1 ];then
	echo 'usage:$0 '
	exit 1
fi	

if [ $1 -lt 5 -o $1 -gt 15 ];then
	echo 'usage:$0 '
	echo ' where 5<=n<=15'
	exit 1
fi

for ((i=0;i<$1;i++))
do
	for ((j=0;j<$[$1-$i-1];j++))
	do
		echo -n " "
	done
	for ((j=0;j<$[2*$i+1];j++))
	do
		echo -n "*"
	done
	echo -ne '\n'
done


##-n表示不换行,-e表示支持转义字符
  • 测试:

2.while循环

  • 语法结构
while expr  # 执行 expr
do # 若 expr 的退出状态为0,进入循环,否则退出while
  commands  # 循环体
done        # 循环结束标志,返回循环顶部
  • 执行过程
    先执行 expr,如果其退出状态为 0,就执行循环体。执行到关键字 done 后,回到循环的顶部,while 命令再次检查 expr 的退出状态。以此类推,循环将一直继续下去,直到 expr 的退出状态非 0 为止。
  • eg:用while循环实现打印星号
#!/bin/bash

if [ $# -ne 1 ];then
	echo 'usage:$0 '
	exit 1
fi	

if [ $1 -lt 5 -o $1 -gt 15 ];then
	echo 'usage:$0 '
	echo ' where 5<=n<=15'
	exit 1
fi

lines=$1			##总行数
curline=0
while [ $curline -lt $lines ]
do
	nSpaces=$[$lines-$curline-1]
	while [ $nSpaces -gt 0 ]
	do
		echo -n " "
		nSpaces=$[$nSpaces-1]
	done
	
	nStarts=$[2*$curline+1]
	while [ $nStars -gt 0 ]
	do
		echo -n "*"
		nStarts=$[$nstarts-1]
	done
	echo			###等价于echo -ne '\n',相当于输出了换行符
	curline=$[$curline+1]
done

3.until循环

  • 语法结构
until expr  # 执行 expr
do # 若expr的退出状态非0,进入循环,否则退出until
  commands  # 循环体
done        # 循环结束标志,返回循环顶部

  • 执行过程
    与 while 循环类似,只是当 expr 退出状态非 0 时才执行循环体,直到 expr 为 0 时退出循环。

  • eg:
    条件不成立时,执行循环体
    条件为假,跳出循环

#!/bin/bash

counter=0

untile [ $counter -eq 3 ]
do
	echo AAA
	sleep 1
	counter=$[$counter+1]
done
  • 测试
    (P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第7张图片
  • break和continue
break [n]
用于强行退出当前循环。
如果是嵌套循环,则 break 命令后面可以跟一数字 n,表示退出第 n 重循环(最里面的为第一重循环)。

continue [n]
用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环。
如果是嵌套循环,continue 命令后面也可跟一数字 n,表示回到第 n 重循环的顶部。
  • exit和sleep
exit n
exit 命令用于退出脚本或当前进程。n 是一个从 0255 的整数,0 表示成功退出,非零表示遇到某种失败而非正常退出。
该整数被保存在状态变量 $? 中。

sleep n
暂停 n 秒钟

4.select与菜单

  • 语法结构
select variable in list 
do          # 循环开始的标志
  commands  # 循环变量每取一次值,循环体就执行一遍
done        # 循环结束的标志
  • 说明:
    (1) select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
    (2) 用户输入菜单列表中的某个数字,执行相应的命令
    (3) 用户输入被保存在内置变量 REPLY 中。

  • select 与 case
    (1) select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c 退出循环。
    (2) select 经常和 case 联合使用
    (3) 与 for 循环类似,可以省略 in list ,此时使用位置参量,等于加双引号的“$@”

  • eg:

#!/bin/bash

##PS3="favority pet?"			为用户增加提示选项
select var in Dogs Cats Birds
do
	case $var in
	Dogs)
		echo Dogs are my favori pet
		##break 		选择第一项会跳出循环
	;;
	Cats)
		echo Cats are my favori pet
	;;
	Birds)
		echo Birsd are my favori pet
	;;
	*)
		echo none are my favori pet
	;;	
	esac
	##break		选择任意一项会跳出循环
done
  • 测试:
    (P6)shell编程入门第六讲:循环语句:for、while、until、select菜单_第8张图片

你可能感兴趣的:(鸟哥Linux私房菜)