bash学习记录(八)循环和分支(2)

循环和分支(二)

多重循环

就像C,Java一样,bash同样可以实现多重循环,下面的例子简单的实现双重循环,如果加上循环控制可能就更难一些了。

1
2
3
4
5
6
7
8
for ((i=0;i<5;i++))
do
for bin in 1 2 4
do
echo $bin
done
echo $i
done

循环控制

影响循环行为的语句。有 breakcontinue 两个循环控制命令,break 命令可以终止循环,而continue可以跳过当前循环提前进入下一次循环,这里和C语言定义的类似。

下面举一个简单的break和continue的例子;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LIMIT=9
a=0
#while [[ $a -le $LIMIT ]]
#do
#let "a=a+1"
#if [ $a -eq 3 ] || [ $a -eq 11 ]
#then
# continue
#fi
#echo $a
# done

while [[ $a -le $LIMIT ]]
do
let "a=a+1"
if [ $a -gt 2 ]
then
break
fi
echo $a
done

简单的break循环只能跳出最内容的循环,而不能跳出多层的循环,可以使用 break N 来跳出多层循环。n为想要跳出循环的层数。

和break像似的continue,同样可以使用 continue N 来实现。这里使用到了一个非常简单明了的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
for outer in I II III IV V # outer loop
do
echo; echo -n "Group $outer: "

# --------------------------------------------------------------------
for inner in 1 2 3 4 5 6 7 8 9 10 # inner loop
do

if [[ "$inner" -eq 7 && "$outer" = "III" ]]
then
continue 2 # Continue at loop on 2nd level, that is "outer loop".
# Replace above line with a simple "continue"
# to see normal loop behavior.
fi
echo -n "$inner " # 7 8 9 10 will not echo on "Group III."
done
# --------------------------------------------------------------------
done
echo; echo
exit 0

测试和分支

使用 caseselect 结构体,不像一个循环,因为它没有一个迭代的一个过程,但是它们能够通过条件指导程序的流向。

通过程序块控制程序流向

Case (in) /esac

在bash中的case结构类似C中的switch结构,是在拥有多种条件下可以使用到的代码块。case结构可以参见下面代码。 (其实是可以有condition的左边的括号的,嗯,可以加上的)

1
2
3
4
5
6
7
8
9
case "$variable" in 

"$condition1" )
command...
;;

"$condition2" )
command...
;;

下面以后会非常有用处的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /bin/bash

case "$1" in
"") echo "Usage: ${0##*/} <filename>"; exit $E_PARAM;;
# No command-line parameters,
# or first parameter empty.
# Note that ${0##*/} is ${var##pattern} param substitution.
# 可以通过使用##partern把前面的./去掉

-*) FILENAME=./$1;; # If filename passed as argument ($1)
#+ starts with a dash,
#+ replace it with ./$1
#+ so further commands don't interpret it
#+ as an option.

* ) FILENAME=$1;; # Otherwise, $1.
esac

select

select是和case结构意义相同的结构体,可以使用自定义的PS3也就是选择提示符。格式如下:

1
2
3
4
5
select variable [in list]
do
command...
break
done

简单实例,这个例子不完整需要再去考虑很多东西。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

PS3="Choose your favorite vegetable:"
select vegetable in "beans" "carrots" "potatoes"
do
if [[ $vegetable = "beans" ]] || [[ $vegetable = "carrots" ]] || [[$vegetable = "potatoes" ]]
then
echo
echo "your favorite veggie is $vegetable"
echo
continue
else
echo "your vegetable not on this list"
break
fi

done
-------------本文结束感谢您的阅读-------------

本文标题:bash学习记录(八)循环和分支(2)

文章作者:NanYin

发布时间:2018年06月11日 - 17:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2018/06/12/2018-06-12-bash_08_bash%E4%B8%AD%E7%9A%84%E5%BE%AA%E7%8E%AF%E5%92%8C%E5%88%86%E6%94%AF%EF%BC%88%E4%BA%8C%EF%BC%89/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。