shell编程快速入门

变量

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

# 1. 变量的定义和使用
username=helloshaohua
echo "1. $username"

# 2. 另一种定义方式
course="linux shell program"
echo 2. ${course}

# 3. 只读变量
readonly course
# course="Go program" # available.sh: line 13: course: readonly variable. | On the mac os.
# unset course # available.sh: line 14: unset: course: cannot unset: readonly variable.
echo "3. ${course}"

# 4. 删除变量
unset usernmae
echo "4. ${username}"

只读变量不能重新赋值,不能删除!

普通变量可以重新赋值,可以删除!

环境变量

定义一个 env.sh shell脚本如下:

1
2
3
4
5
6
7
#!/bin/bash

# 1. export 导出一个环境变量
export SHAOHUA="helloshaohua"

# 2. 查找自定义的环境变量
env | grep "SHAOHUA"

运行 env.sh shell脚本,得到如下结果:

1
2
3
$ sh env.sh

SHAOHUA=helloshaohua

特殊变量

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n是一个数字,表示第几个参数,例如,第一个参数是$1,第二个参数是$2
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数
$@ 传递给脚本或函数的所有参数。被双引号(" “)包含时,与$*稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值
$$ 当前shell进程ID。对于shell脚本,就是这些脚本所在的进程ID。

定义一个 special-variable.sh shell脚本如下:

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

# 特殊变量 $0 表示当前脚本的文件名称.
echo "当前脚本文件名称:$0"

# 获取传递给脚本的第一个参数.
echo "参数1:$1"

# 获取传递给脚本的第二个参数.
echo "参数2:$2"

# 传递给脚本或函数的参数个数.
echo "参数个数:$#"

# 获取传递给脚本的所有参数.
echo "所有参数:$@"

运行 special-variable.sh shell脚本,得到如下结果:

1
2
3
4
5
6
$ sh special.sh hello world helloshaohua hellochina
当前脚本文件名称:special.sh
参数1:hello
参数2:world
参数个数:4
所有参数:hello world helloshaohua hellochina

算术运算

运算符 含义
+
-
*
/
% 取余

定义一个 arithmetic-operation.sh shell脚本如下,以测试具体使用情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

a=10
b=25

# 加法 expr 运算符
sum=`expr $a + $b`
echo "$a + $b = $sum"

# 另一种数值运算 $[expression]
sub=$[a-b]
echo "$a - $b = $sub"

# 乘法
ride_val=$[a*b]
echo "$a * $b = $ride_val"

# 除法
divide_val=$[b/a]
echo "$b / $a = $divide_val"

# 取余
surplus_val=$[b%a]
echo "$b % $a = $surplus_val"

运行 arithmetic-operation.sh shell脚本,得到如下结果:

1
2
3
4
5
6
$ sh arithmetic-operation.sh
10 + 25 = 35
10 - 25 = -15
10 * 25 = 250
25 / 10 = 2
25 % 10 = 5

expr 运算符表示运算,意为将expr右侧的表达式进行计算,从上面的脚本文件代码中可以看出,其实这种方式不太常用,而$[expression] 这种方式更加常用,因为写起来比较方便嘛!

关系运算

运算符 含义
-eq 相等
-ne 不相等
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

定义一个 relational-calculus.sh shell脚本如下,以测试 关系运算 具体使用情况:

 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
#!/bin/bash

a=10
b=25

# -eq 相等
if [ $a -eq $b ]; then
  echo "$a -eq $b: $a 等于 $b"
else
  echo "$a -eq $b: $a 不等于 $b"
fi

# -ne 不相等
if [ $a -ne $b ]; then
  echo "$a -ne $b: $a 不等于 $b"
else
  echo "$a -ne $b: $a 等于 $b"
fi

# -gt 大于
if [ $a -gt $b ]; then
  echo "$a -gt $b: $a 大于 $b"
else
  echo "$a -gt $b: $a 不大于 $b"
fi

# -gt 大于等于
if [ $a -ge $b ]; then
  echo "$a -ge $b: $a 大于等于 $b"
else
  echo "$a -ge $b: $a 不大于等于 $b"
fi


# -lt 小于
if [ $a -lt $b ]; then
  echo "$a -lt $b: $a 小于 $b"
else
  echo "$a -lt $b: $a 不小于 $b"
fi

# -le 小于等于
if [ $a -le $b ]; then
  echo "$a -le $b: $a 小于等于 $b"
else
  echo "$a -le $b: $a 不小于等于 $b"
fi

运行 relational-calculus.sh shell脚本,得到如下结果:

1
2
3
4
5
6
7
$ sh relational-calculus.sh
10 -eq 25: 10 不等于 25
10 -ne 25: 10 不等于 25
10 -gt 25: 10 不大于 25
10 -ge 25: 10 不大于等于 25
10 -lt 25: 10 小于 25
10 -le 25: 10 小于等于 25

是不是灰常简单~

布尔与逻辑运算

运算符 含义
! 非运算 [ !false ]
-o 或运算
-a 与运算 [ $a -lt 100 -a $b -gt 15 ]
&& 逻辑与 [[ $a -lt 100 && $b -gt 1 ]]
|| 逻辑或
== 相等(数字)
!= 不行(数字)

定义一个 boolean-logic.sh shell脚本如下,以测试 布尔与逻辑运算 具体使用情况:

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

a=10
b=25

# 布尔运算(-eq, -ne, -gt, -ge, -lt, -le),也可以理解为:由关系运算符组成的布尔运算表达式.
if [ $a -eq $b ]; then
  echo "$a -eq $b: $a 等于 $b"
else
  echo "$a -eq $b: $a 不等于 $b"
fi

# 逻辑运算, 注意两个[[  ]] 方括号.
if [[ $a -gt 0 && $b -gt 0 ]]; then
  echo "$a, $b 都大于 0"
fi

运行 boolean-logic.sh shell脚本,得到如下结果:

1
2
3
$ sh boolean-logic.sh
10 -eq 25: 10 不等于 25
10, 25 都大于 0

所有的语言基本都是一样,分支语句都是测试布尔表达式进行代码路由的一个过程,代码路由,这个概念你可以没有听说过,这个是我随口说的哦,其实就是条件执行. 而布尔表达式最终可以得到这些 条件,布尔表达式一般由关系运算符组成。

文件测试运算

运算符 含义
-d 是否为目录
-f 是否为普通文件
-r 是否可读
-w 是否可写
-x 是否可执行
-s 文件是否为空
-e 文件是否存在

定义一个 file.sh shell脚本如下,以测试 文件测试运算 具体使用情况:

 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
#!/bin/bash

tmp_dir="/tmp"
tmp_helloshaohua_txt="$tmp_dir/helloshaohua.txt"

# 创建一个新文件,没有任何内容,也就是空文件.
touch $tmp_helloshaohua_txt

# -d 是否为目录
if [ -d $tmp_dir ]; then
  echo "$tmp_dir 是目录"
else
  echo "$tmp_dir 不是目录"
fi

# -f 文件是否为普通文件
if [ -f $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件是普通文件"
else
  echo "$tmp_helloshaohua_txt 文件不是普通文件"
fi

# -r 文件是否可读
if [ -r $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件可读"
else
  echo "$tmp_helloshaohua_txt 文件不可读"
fi

# -w 文件是否可写
if [ -w $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件可写"
else
  echo "$tmp_helloshaohua_txt 文件不可写"
fi

# -x 文件是否可执行
if [ -x $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件可执行"
else
  echo "$tmp_helloshaohua_txt 文件不可执行"
fi

# -s 文件是否为空,注意啦:The non zero output indicate that file is empty,
# 意为:非零输出表示文件为空。
# 可以参考:https://www.cyberciti.biz/faq/linux-unix-script-check-if-file-empty-or-not/
if [ ! -s $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件为空"
else
  echo "$tmp_helloshaohua_txt 文件不为空"
fi

# -e 文件是否存在
if [ -e $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件存在"
else
  echo "$tmp_helloshaohua_txt 文件不存在"
fi

# 写入内容到文件
echo "写入helloshaohua字符串到${tmp_helloshaohua_txt}文件"
echo "helloshaohua" >> $tmp_helloshaohua_txt

# 再次检测文件是否为空,这部分和上面部分代码重复可以提取定义为一个函数,
# 这里简单起见,暂不定义函数,具体会到函数部分说明.
# 这次检测应该是输出 `/tmp/helloshaohua.txt 文件不为空` 才对~
if [ ! -s $tmp_helloshaohua_txt ]; then
  echo "$tmp_helloshaohua_txt 文件为空"
else
  echo "$tmp_helloshaohua_txt 文件不为空"
fi

运行 file.sh shell脚本,得到如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ sh file.sh
/tmp 是目录
/tmp/helloshaohua.txt 文件是普通文件
/tmp/helloshaohua.txt 文件可读
/tmp/helloshaohua.txt 文件可写
/tmp/helloshaohua.txt 文件不可执行
/tmp/helloshaohua.txt 文件不为空
/tmp/helloshaohua.txt 文件存在
写入helloshaohua字符串到/tmp/helloshaohua.txt文件
/tmp/helloshaohua.txt 文件不为空

字符串

定义方式 含义
单引号 原样输出,变量无效
双引号 可以包含变量

定义一个 string.sh shell脚本如下,以测试 字符串 具体使用情况,其实也特定简单:

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

tutorial="Linux shell脚本编程快速入门"

# 单引号
question='Linux shell脚本编程如何学习?$tutorial'
echo $question


# 双引号
answer="请阅读《${tutorial}》博客内容!"
echo $answer

# 字符串拼接
echo -e "拼接后一起输出:\n"${question}"\n"$answer

运行 string.sh shell脚本,得到如下结果:

1
2
3
4
5
6
$ sh string.sh
Linux shell脚本编程如何学习?$tutorial
请阅读《Linux shell脚本编程快速入门》博客内容!
-e 拼接后一起输出:
Linux shell脚本编程如何学习?$tutorial
请阅读《Linux shell脚本编程快速入门》博客内容!

单引号字符串内如果包含变量将原样输出变量名,也就是说它不会解析,双引号字符串内如果包含变量将会解析变量为具体值,单引号 定义字符串并不常用。最常用的是 双引号 定义字符串。

字符串操作

定义方式 含义
${#variable} 获取字符串长度。
${variable:start:end} 获取字符串子串。
expr index "$variable" sub_str 查找字符串子串。

定义一个 string-operate.sh shell脚本如下,以测试 字符串操作 具体使用情况:

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

# 普通变量定义
user="helloshaohua"

# 获取字符串长度
echo "字符串${user}的长度为:${#user}"

# 获取字符串子串
echo "字符串${user}子串:${user:5:${#user}-1}"

# 查找字符串子串位置
matched=`expr index "$user" s`
echo "字符串${user}查找字符串子串位置s为:$matched"

运行 string-operate.sh shell脚本,得到如下结果:

1
2
3
4
$ sh hello.sh
字符串helloshaohua的长度为:12
字符串helloshaohua子串:shaohua
字符串helloshaohua查找字符串子串位置s为:6

字符串操运算符

运算符 含义
= 字符串是否相等[$a = $b]
!= 字符串是否不相等[$a != $b]
-z 字符串长度是否为0[-z $a]
-n 字符串长度是否不为0[-n "$a"]
$ 字符串是否为空[$a]

注意: 左中括号[之后和右中括号]之前应该有一个空格

数组

  • 定义,下标从 0 开始.
  • 设置/读取数组元素.
  • 读取数组所有元素 @.
  • 读取数组长度.

定义一个 array.sh shell脚本如下,以测试 数组 具体使用情况:

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

# 1. 数组的定义
oss=("linux", "darwin", "window", "android")

# 2. 设置数组元素(是可以说是更新某个数组元素)
oss[1]="MacOSX"

# 3. 读取数组元素
echo "数组下标(索引)为2的元素:${oss[1]}"

# 4. 读取数组所有元素
echo "数组所有元素:${oss[@]}"

# 5. 获取数组长度
len=${#oss[@]}
echo "数组长度为:$len"

运行 array.sh shell脚本,得到如下结果:

1
2
3
4
$ sh array.sh
数组下标(索引)为2的元素:MacOSX
数组所有元素:linux, MacOSX window, android
数组长度为:4

分支语句

if

如果您有语言基础,这个分支语句肯定是对您来说是非常简单喽,没有也没有关系,所谓的分支语句就是根据判断条件的真假,选择具体的分支进行执行代码,如果被测试的条件都不为真,有 else 分支时,执行 else 分支,否则当前分支块执行结束,继续向下执行代码。

 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
#!/bin/bash

# 普通变量定义
age=18

# 第一种写法:if 分支语句,每一条判断语句后跟一个 then 关键字的使用方式.
if [ $age -le 10 ]; then
  echo "${age}小于等于10:少年"
elif [ $age -le 20 ]; then
  echo "${age}小于等于20:青年"
elif [ $age -le 50 ]; then
  echo "${age}小于等于50:中年"
else
  echo "老年"
fi

# 第二种写法:if 分支语句,每一条判断语句换行跟一个 then 关键字的使用方式.
if [ $age -le 10 ]
then
  echo "${age}小于等于10:少年"
elif [ $age -le 20 ]
then
  echo "${age}小于等于20:青年"
elif [ $age -le 50 ]
then
  echo "${age}小于等于50:中年"
else
  echo "老年"
fi

运行 if.sh shell脚本,得到如下结果:

1
2
3
$ sh if.sh
18小于等于20:青年
18小于等于20:青年

在上面的 if.sh shell脚本文件中有两种if分支结构的写法,第一种是最常用的用法,第二种使脚本代码不易读。建议使用第一种写法。

case

这个case中其它编程语言中就是 switch...case 分支结构喽,在shell中它叫case,所完成的功能是相同的。接下来定义一个 case.sh shell脚本,以测试 case 具体使用情况:

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

# 普通变量定义
os="hello"

case $os in
"windows")
  echo "当前系统是Windows操作系统." ;;
"linux")
  echo "当前系统是Linux操作系统." ;;
"darwin")
  echo "当前系统是Mac操作系统." ;;
"android")
  echo "当前系统是Mac操作系统." ;;
*)
  echo "当前系统是${os},未知操作系统类型." ;;
esac

运行 case.sh shell脚本,得到如下结果:

1
2
$ sh case.sh
当前系统是hello,未知操作系统类型.

case的默认分支语句用星号 * 通配符表示,这是shell中与其它常规编程语言的的一个区别。表示当所有其它分支测试条件都不满足时,将会执行默认分支。通俗地讲就是不管测试的具体值是什么总是有一个分支将会被执行。

循环

通过循环结构让程序重复的执行某种操作,直到条件为真的时,退出循环。

for

与其他编程语言类似,Shell支持for循环。 for 循环的一般格式为:

1
2
3
4
5
6
7
for 变量 in 列表; do
  command1
  command2
  command3
  ...
  commandN
done

列表是一组值(数字、字符串等)组成的序列,第个值通过空格分隔。每循环一次,就将列表中的下一个值赋值给变量。in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

例如,定义一个 for-with-simple-list.sh shell脚本文件,顺序输出当前列表中的数字:

1
2
3
4
5
#!/bin/bash

for val in 1 2 3 4 5 6 7 8 9 10; do
	echo "当前值为: ${val}"
done

执行 for-with-simple-list.sh shell脚本文件,得到如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sh for-with-simple-list.sh
当前值为: 1
当前值为: 2
当前值为: 3
当前值为: 4
当前值为: 5
当前值为: 6
当前值为: 7
当前值为: 8
当前值为: 9
当前值为: 10

接下来定义一个 for-with-string-char.sh shell脚本文件,以顺序输出字符串中的子字符串:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

# 普通变量定义
str='Hello World, 中国'
num=1

for c in ${str}; do
	echo "字符串{${str}},第${num}次循环获取到的子字符串为${c}"
	num=$[num + 1]
done

执行 for-with-string-char.sh shell脚本文件,得到如下结果:

1
2
3
4
$ sh for-with-string-char.sh
字符串{Hello World, 中国},第1次循环获取到的子字符串为Hello
字符串{Hello World, 中国},第2次循环获取到的子字符串为World,
字符串{Hello World, 中国},第3次循环获取到的子字符串为中国

再来看一个使用案例,定义一个 show-home-git-related-files.sh shell脚本文件,以顺序输出家目录下以 .git 开头的文件:

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 普通变量定义
files=$HOME/.git*

# 循环输出每一个以 `.git` 开头的文件路径
for f in $files; do
  echo "以{.git}开头的文件:${f}"
done

执行 show-home-git-related-files.sh shell脚本文件,得到如下结果:

1
2
3
4
$ sh show-home-git-related-files.sh
{.git}开头的文件:/Users/helloshaohua/.gitconfig
{.git}开头的文件:/Users/helloshaohua/.gitflow_export
{.git}开头的文件:/Users/helloshaohua/.gitignore_global

while

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为布尔表达式测试条件。其格式为:

1
2
3
while command; do
  statements to be executed if command is true
done

命令执行完毕,当前一次的循环也就结束了,循环控制返回循环顶部,从头开始直至测试条件为假,while循环退出,继续下向执行代码。

来定义一个 while-with-counter-less-than-10.sh shell脚本文件,看一个基本的while循环如何使用,测试条件是:如果counter小10,那么返回true,否则返回false,counter从0开始,每次循环处理时,counter加1,当counter为10时,测试条件为false,while循环退出。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

# 普通变量定义
counter=0

# while 循环输出计数器的值
while [ $counter -lt 10 ]; do
    counter=$[counter+1]
    echo "第${counter}次循环,计数器为:${counter}"
done

执行 while-with-counter-less-than-10.sh shell脚本文件,得到如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sh while-with-counter-less-than-10.sh
第1次循环,计数器为:1
第2次循环,计数器为:2
第3次循环,计数器为:3
第4次循环,计数器为:4
第5次循环,计数器为:5
第6次循环,计数器为:6
第7次循环,计数器为:7
第8次循环,计数器为:8
第9次循环,计数器为:9
第10次循环,计数器为:10

while 读取文件内容,也非常方便,定义一个 read-files.sh shell脚本文件,以读取 /tmp/helloshaohua 目录下的所有文件内容并输出。

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

# 普通变量定义
files="/tmp/helloshaohua/*"

for fl in $files; do
  # 检测是否是普通文件,并且文件内容不为空,
  # 条件成立时读取,不成立时忽略该文件。
	if [[ -f $fl && -s $fl ]]; then
	  # 循环读取每一行文件内容打印。
		while IFS= read -r line; do
		  printf '%s\n' "$line"
    done < $fl
	fi
done

/tmp/helloshaohua目录具体的文件列表如下:

1
2
3
4
5
$ ll /tmp/helloshaohua
total 24
-rw-r--r--  1 helloshaohua  wheel    47B  5 20 18:11 a.txt
-rw-r--r--  1 helloshaohua  wheel    47B  5 20 18:13 b.txt
-rw-r--r--  1 helloshaohua  wheel    47B  5 20 18:13 c.txt

/tmp/helloshaohua目录具体的文件内容如下:

1
2
3
4
5
6
7
$ cat /tmp/helloshaohua/a.txt /tmp/helloshaohua/b.txt /tmp/helloshaohua/c.txt
This is a.txt file.
The file extension is txt.
This is b.txt file.
The file extension is txt.
This is c.txt file.
The file extension is txt.

执行 read-files.sh shell脚本文件,得到如下结果:

1
2
3
4
5
6
7
$ sh read-files.sh
This is a.txt file.
The file extension is txt.
This is b.txt file.
The file extension is txt.
This is c.txt file.
The file extension is txt.

可以看到打印出的文件内容信息,与cat多个文件是一致的。

while 循环可用于读取键盘输入信息。下面定义一个 read-input-data.sh shell脚本文件,以读取从自键盘的输入数据。

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

echo '键入<CTRL-C>终止'
echo -n '输入您最喜欢的电影:'
while read FILE; do
  # 如果输入的电影名为空,则提示输入,
  # 否则输出关于该电影的评价。
  if [ ${#FILE} -gt 0 ]; then
    echo "是的!《${FILE}》非常赞的电影~"
  else
    echo -n '输入您最喜欢的电影:'
  fi
done

执行 read-input-data.sh shell脚本文件,得到如下结果:

1
2
3
4
5
6
7
$ sh read-input-data.sh
键入<CTRL-C>终止
输入您最喜欢的电影:人之怒
是的!《人之怒》非常赞的电影~
输入您最喜欢的电影:hello
是的!《hello》非常赞的电影~
输入您最喜欢的电影:

你可以多次输入,按 CTRL-C 退出shell脚本程序运行。

until

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。until循环格式为:

1
2
3
until [ command ]; do
    statements to be executed if command is false
done

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

下面定义一个 until.sh shell脚本文件,以使用 until 命令输出 0 ~ 9 的数字:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

# 普通变量定义
counter=0

# until 循环输出
until [ ! $counter -lt 10 ]; do
    echo "当前计数器为:${counter}"
    counter=$[counter+1]
done

执行 until.sh shell脚本文件,得到如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sh until.sh
当前计数器为:0
当前计数器为:1
当前计数器为:2
当前计数器为:3
当前计数器为:4
当前计数器为:5
当前计数器为:6
当前计数器为:7
当前计数器为:8
当前计数器为:9

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。

break命令

break命令允许跳出所有循环(终止执行当前循环结构后面的所有循环)。下面来定义一个 break-while.sh shell脚本文件,以测试脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,就要使用break命令。

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

while : ; do
    echo -n "输入1到5之间的数字: "
    read NUMBER
    case $NUMBER in
    1|2|3|4|5)
      echo "你输入的数字是:${NUMBER}"
      ;;
    *)
      echo "你输入的数字不是1到5之间的数字游戏结束~"
      break
      ;;
    esac
done

执行 break-while.sh shell脚本文件,得到如下结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sh break-while.sh
输入1到5之间的数字: 3
你输入的数字是:3
输入1到5之间的数字: 2
你输入的数字是:2
输入1到5之间的数字: 5
你输入的数字是:5
输入1到5之间的数字: 5
你输入的数字是:5
输入1到5之间的数字: 6
你输入的数字不是1到5之间的数字游戏结束~

在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:

1
break n

表示跳出第n层循环。

continue

comments powered by Disqus