Shell语法
- 格式:doc
- 大小:40.00 KB
- 文档页数:13
shell 定义枚举摘要:1.Shell 定义概述2.Shell 定义的基本语法3.Shell 定义的枚举类型4.Shell 定义的应用示例5.总结正文:【1.Shell 定义概述】Shell 定义是计算机编程中一种重要的数据类型定义方法,通常用于表示一系列的离散值。
在程序设计中,我们常常需要处理一些固定的、有限的值,这时候就需要使用到枚举类型。
Shell 定义能够将这些有限的值定义为一种特定的数据类型,使得程序在处理这些值时更加方便和简洁。
【2.Shell 定义的基本语法】Shell 定义的基本语法如下:```enum 枚举类型名{枚举值1,枚举值2,...,枚举值n};```其中,枚举类型名可以是任何合法的标识符,枚举值可以是任意整数或者字符。
需要注意的是,枚举值之间以逗号分隔,最后一个枚举值后面不需要加分号。
【3.Shell 定义的枚举类型】在Shell 定义中,枚举类型可以分为以下几种:1.整型枚举:整型枚举是最常见的枚举类型,它的枚举值是整数。
例如,我们可以定义一个整型枚举来表示方向:```enum Direction {NORTH,EAST,SOUTH,WEST};```2.字符型枚举:字符型枚举的枚举值是字符。
例如,我们可以定义一个字符型枚举来表示运算符优先级:```enum OperatorPrecedence {PLUS("+"),MINUS("-"),MULTIPLY("*"),DIVIDE("/")};```3.字符串枚举:字符串枚举的枚举值是字符串。
例如,我们可以定义一个字符串枚举来表示季节:```enum Season {SPRING("春天"),SUMMER("夏天"),AUTUMN("秋天"),WINTER("冬天")};```【4.Shell 定义的应用示例】下面是一个Shell 定义在实际编程中的应用示例。
cshell语法if摘要:1.cshell 语法if 概述2.cshell 语法if 的基本语法3.cshell 语法if 的用法示例4.cshell 语法if 的注意事项正文:1.cshell 语法if 概述cshell 是一种用于编写自动化脚本的编程语言,常用于Unix 和类Unix 系统。
在cshell 中,if 语句是一种条件判断语句,可以根据指定的条件执行相应的代码块。
if 语句广泛应用于脚本中的逻辑判断和条件处理,使得脚本能够根据不同的情况执行不同的操作。
2.cshell 语法if 的基本语法cshell 中的if 语句的基本语法如下:```if 条件then// 条件成立时执行的代码块else// 条件不成立时执行的代码块fi```其中,条件可以是一个表达式,也可以是一个简单的操作符,如-eq、-ne、-lt、-gt 等。
then 和fi 是if 语句的关键字,它们分别表示条件成立时和条件不成立时代码块的开始和结束。
3.cshell 语法if 的用法示例下面是一个简单的cshell if 语句的示例:```#!/bin/cshset var1 = 10set var2 = 20if ($var1 -eq $var2) thenecho "var1 is equal to var2"elseecho "var1 is not equal to var2"fi```在这个示例中,我们首先设置了两个变量var1 和var2 的值,然后使用if 语句判断这两个变量是否相等。
如果相等,则输出"var1 is equal to var2",否则输出"var1 is not equal to var2"。
4.cshell 语法if 的注意事项在使用cshell 中的if 语句时,需要注意以下几点:- 条件判断中的表达式或操作符应正确无误,以避免语法错误。
在Shell脚本中,分号(;)用于分隔命令。
在大多数Shell环境中,分号的作用类似于换行符,可以将多个命令写在同一行上。
使用分号可以将多个命令链接在一起,使它们在同一个Shell会话中依次执行。
以下是一个使用分号的Shell脚本示例:
```bash
echo "Hello"; echo "World"
```
在上面的示例中,两个echo命令之间使用分号分隔。
当脚本执行时,它会先执行第一个echo命令输出"Hello",然后执行第二个echo命令输出"World"。
除了分号,还有其他几种方式可以分隔Shell命令:
1. 换行符:每个命令占据一行,这是最常见的分隔方式。
2. 管道符(|):将一个命令的输出作为另一个命令的输入。
3. 逻辑运算符(&& 和 ||):用于控制命令的执行顺序。
&& 表示前一个命令成功执行后才执行后一个命令,|| 表示前一个命令失败时才执行后一个命令。
需要注意的是,分号用于分隔命令,而不是连接命令。
如果需要将多个命令的输出连接在一起,可以使用输出重定向(>),或者使用命令替换($(command))。
shell多条件判断语句shell多条件判断语句是指在shell编程中,使用多个条件多重判断语句以实现不同的功能行为。
这种语句实现方式是非常有用的,可以在shell编程中准确地控制程序的执行。
一、shell多条件判断语句的语法shell多条件判断语句的基本语法为:if condition1; thencommand1elif condition2; thencommand2elif condition3; thencommand3...elsecommandnfi1. if开头:if语句表示判断开始标志,开始判断是否满足第一个条件。
2. conditionN:conditionN表示判断的条件,当某个条件满足时,会执行相应的命令。
3. then:then表示当条件满足时,会执行just after then后面的命令。
4. elif:elif表示当if之前的条件不满足,就会开始判断elif之后的条件是否满足,如果满足就执行elif后面的命令。
5. else:else表示在elif中的每一个条件都不满足时,就会执行else之后的命令。
6. fi:fi表示判断结束标志,表示判断全部结束,此时我们就可以结束程序。
二、shell多条件判断语句的实例1. 判断文件是否存在#!/bin/bashif [ -e "file1.txt" ]; thenecho "file1.txt exists"elseecho "file1.txt does not exist"fi此实例中,首先使用if判断文件file1.txt是否存在,如果存在则输出“file1.txt exists”,如果不存在则输出“file1.txt does not exist”。
2.使用数字进行判断#!/bin/bashif [ num -lt 10 ]; thenecho "Number is less than 10"elif [ num -eq 10 ]; thenecho "Number is equal to 10"elseecho "Number is greater than 10"fi此实例中,首先使用if判断num是否小于10,如果小于10,则输出“Number is less than 10”;如果等于10,则输出“Number is equal to 10”;如果大于10,则输出“Number is greater than 10”。
shell if语法一、基本语法if 语句主要有一下几种形式。
1.1 if(1)形式一if condition; then符合 condition 的执行语句fi注意:结尾是将 if 倒过来写 fi 作为结束标志。
(2)形式二可以将 then 写到与 if 在一行,也可以分行写,如下所示:if conditionthen符合 condition 的执行语句fi1.2 if else单独的一个 if else 语句,如下所示:if conditionthen符合 condition 的执行语句else不符合 condition 的执行语句这里 then 也可以写到与 if 在一行中。
1.3 if elif注意:Shell 里将 else if 简写为 elif,elif 也要有 then,如下所示:if condition_1then符合 condition_1 的执行语句elif condition_2then符合 condition_2 的执行语句else不符合 condition_1 和 condition_2 的执行语句fi当然,还有更多的组合形式,这里就不一一说明了。
二、实例2.1 if 语句#!/bin/bashfile="/root"#形式一if [ -d $file ]; thenecho "$file is directory!"#形式二if [ -d $file ]thenecho "$file is directory!"fi2.2 if else 语句#!/bin/bashfile="/root"if [ -d $file ]thenecho "$file is directory!" elseecho "$file is not directory!" fi2.3 if elif 语句#!/bin/bashfile="/root"if [ -f $file ]thenecho "$file is regular file!" elif [ -d $file ]echo "$file is directory!"elseecho "$file is not regular file and directory"fi三、总结if 语句判断逻辑各种编程语言都是通用的,在 Shell 中要注意if语句结尾使用 fi(if 倒过来写),else if 应写成 elif ,还有在写 if 和 elif 时别忘记 then。
shell的基础语法Shell是一种命令行解释器,它允许用户与操作系统进行交互并执行各种操作。
Shell的基础语法包括以下几个方面:1. 命令执行,在Shell中,用户可以直接输入命令来执行各种操作,例如`ls`命令用于列出当前目录下的文件和文件夹,`mkdir`命令用于创建新的目录等。
2. 变量,在Shell中,可以使用变量来存储数据并在需要的时候进行引用。
变量的赋值和引用使用类似于`variable_name=value`和`$variable_name`的语法。
3. 控制结构,Shell支持基本的控制结构,如条件判断和循环。
条件判断使用`if-then-else-fi`语法,而循环则可以使用`for`、`while`等关键字来实现。
4. 函数,Shell中可以定义和调用函数,使用`function_name() { ... }`的语法来定义函数,使用`function_name`来调用函数。
5. 管道和重定向,Shell支持管道和重定向操作,允许用户将一个命令的输出作为另一个命令的输入,或者将命令的输入/输出重定向到文件或其他设备。
6. 通配符,Shell支持通配符来匹配文件名,例如``用于匹配任意字符,`?`用于匹配单个字符等。
7. 注释,在Shell脚本中,可以使用`#`符号来添加注释,注释部分将被解释器忽略。
总的来说,Shell的基础语法包括了命令执行、变量、控制结构、函数、管道和重定向、通配符以及注释等内容。
掌握这些基础语法对于编写Shell脚本和在命令行下进行操作都是非常重要的。
希望这些信息能够帮助你更好地理解Shell的基础语法。
cshell语法Cshell是一种Unix Shell程序,主要用于在命令行界面下与操作系统进行交互。
Cshell语法是Cshell编程中必须掌握的一部分,它允许用户编写脚本来自动化一系列操作。
Cshell语法的基本结构与C语言类似,包含命令、参数和控制结构等。
以下是一些常用的Cshell语法:1. 命令和参数:Cshell中,命令和参数是以空格分隔的。
命令用来执行特定的任务,而参数用来给命令传递额外的信息。
例如,在Cshell中执行"ls -l"命令可以列出当前目录下的文件和文件夹,并显示详细信息。
2. 注释:在Cshell中,使用"#"符号来注释一行代码。
注释通常用来解释脚本的功能或提醒自己后续需要添加的代码。
例如,可以在脚本中添加注释,说明某一行代码的作用。
3. 变量:可以在Cshell中使用变量来存储值和临时数据。
变量名不需要预先声明,直接使用即可。
变量赋值使用"="符号,例如"var=100"。
使用变量时需要使用"$"前缀,例如"echo $var"将会输出"100"。
4. 控制结构:Cshell中提供了多种控制结构,用于根据条件执行不同的代码块。
常见的控制结构包括if语句、for循环和while循环。
if语句用于条件判断,for循环用于重复执行一段代码块,while循环用于在满足条件时执行一段代码块。
5. 输入和输出重定向:Cshell提供了输入和输出重定向的功能,允许用户将命令的输入和输出重定向到文件或其他设备。
输出重定向使用">"符号,例如"ls > output.txt"将目录列表输出到名为output.txt的文件中。
输入重定向使用"<"符号,例如"wc -l < input.txt"将会统计input.txt文件中的行数。
shell的case语法摘要:1.Shell简介2.Shell中的case语法a.基本结构b.模式匹配c.分支与循环d.默认分支3.示例a.简单示例b.更复杂的示例4.总结正文:Shell是一种用于管理操作系统和应用程序的脚本语言。
在Shell中,有一种叫做case的语法,可以用于根据不同的条件执行不同的命令。
本文将详细介绍Shell中的case语法。
首先,让我们了解一下Shell的基本概念。
Shell是一个命令行解释器,它可以执行操作系统和应用程序的命令。
Shell脚本是一种文本文件,其中包含了一系列的Shell命令。
当你运行一个Shell脚本时,Shell会逐行解释并执行其中的命令。
在Shell中,case语法用于根据不同的条件执行不同的命令。
它的基本结构如下:```case 变量名in模式1)命令序列1;;模式2)命令序列2;;*)默认命令序列;;esac```这里的变量名是一个需要判断的变量,模式1和模式2是不同的模式,用于匹配变量名的值。
在每种模式下,都会执行相应的命令序列。
默认分支是在所有模式都无法匹配时执行的命令序列。
在Shell中,模式匹配是非常灵活的。
你可以使用通配符(如*和?)和元字符(如[]和!)来构建复杂的模式。
例如,下面的代码可以根据输入的数字执行相应的命令:```case 输入的数字in1)echo "你输入的是1";;2)echo "你输入的是2";;3)echo "你输入的是3";;*)echo "你输入的不是1、2或3";;esac```在上面的代码中,输入的数字将依次与模式1、模式2和模式3进行匹配。
如果输入的数字与任何一个模式匹配,都会执行相应的命令序列。
如果没有任何模式匹配,将执行默认分支。
在实际应用中,case语法可以与分支和循环结构结合使用,实现更复杂的功能。
例如,下面的代码可以根据用户输入的命令执行相应的操作:```while true; doecho "请输入一个命令(退出请输入q):"read 命令case 命令inls)ls;;cd)echo "请输入要切换的目录:"read 目录cd 目录;;q)break;;*)echo "无效的命令,请重新输入";;esacdone```在上面的代码中,使用了一个while循环来不断读取用户输入的命令。
shell $[]的用法Shell是操作系统中用于管理和执行命令的程序,而$[]是Shell 中的一个特殊符号,用于引用bash内置的数组变量。
本文将介绍$[]的用法,包括数组的声明、访问和操作。
一、数组的声明在Shell中,可以使用$[]来声明数组,语法如下:```shellarray_name[index]=value```其中,array_name是数组的名称,index是数组元素的索引,value是数组元素的值。
例如,以下代码声明了一个名为my_array的数组,并初始化了两个元素:```shellmy_array[0]=applemy_array[1]=banana```二、访问数组元素要访问数组中的元素,可以使用方括号和索引来指定元素的序号。
例如,要获取my_array数组中的第一个元素,可以使用以下命令:```shellelement_value=${my_array[0]}```这将把my_array数组中的第一个元素赋值给变量element_value。
如果要获取数组中的多个元素,可以使用循环结构来实现。
三、操作数组元素除了访问数组元素外,还可以对数组元素进行操作,例如修改元素的值或删除元素。
以下是一些常见的操作示例:1.修改元素值:可以使用${}语法来修改数组元素的值。
例如,要将my_array数组中的第一个元素更改为orange,可以使用以下命令:```shell${my_array[0]}="orange"```这将把my_array数组中的第一个元素的值更改为"orange"。
2.删除元素:可以使用删除操作符-d来删除数组中的元素。
例如,要删除my_array数组中的第二个元素,可以使用以下命令:```shellunsetmy_array[1]```这将删除my_array数组中的第二个元素。
需要注意的是,使用unset命令删除数组元素后,该元素将不再存在,因此在后续代码中需要重新使用该元素的值。
shell断言语法一、什么是断言?在编程语言中,断言(assertion)是指一种布尔类型的表达式,它用来在代码的特定点检查某个假设是否为真。
如果这个断言的结果为false,那么程序就会抛出一个异常,从而让开发者知道哪个假设没有得到满足。
二、shell断言语法在shell语言中,断言也被称为条件检查(condition check),它可以用来确保程序在执行过程中某些关键条件是得到满足的。
与其他编程语言的断言语法不同,shell中的断言语法没有关键词assert 或者assertion,而是使用一个 test 命令来实现,具体语法如下:```test EXPR```也可以使用下面更为简洁的语法:```[ EXPR ]```其中,EXPR是一个布尔表达式,可以使用常规的比较符号(例如-eq、-ne、-gt、-lt、-ge、-le)、逻辑符号(例如&&、||、!)、文件测试符号(例如-f、-d、-r、-w、-x)等。
三、使用shell断言语法的例子下面是一些使用shell断言语法的例子:1. 检查文件是否存在```[ -f filename ] || echo "文件不存在"```2. 判断变量是否为空```[ -z "${var}" ] && echo "变量为空"```3. 比较两个数的大小```[ $num1 -gt $num2 ] && echo "num1大于num2"```四、注意事项在使用shell断言语法时,需要注意以下几点:1. EXPR中的每个符号和参数都必须用空格分隔开。
2. 布尔表达式中的变量名称必须加上双引号,以免出现空格或特殊字符。
3. shell断言语法中没有关键词“true”或“false”,它们被认为是命令的成功或失败输出。
4. 在特殊情况下,可能需要将一些命令的输出重定向到/dev/null中,以避免出现意想不到的结果。
Shell编程在DOS中,你可能会从事一些例行的重复性工作,此时你会将这些重复性的命令写成批处理文件,只要执行这个批处理文件就等于执行这些命令。
大家会问在UNIX中是否有批处理这个东东,答案是有的。
在UNIX中不只有如DOS的批处理,它的功能比起DOS的批处理更强大,相对地也较复杂,已经和一般的高级语言不相上下。
在UNIX中大家都不叫做批处理文件,而叫做Shell Script。
一般而言,Shell Script的地位和其它的可执行文件(或命令)是完全相同的,只不过Shell Script是以文本文件的方式储存,而非二进制文件。
而执行Shell Script时,必须有一个程序将其内容转成一道道的命令执行,而这个程序其实就是Shell ,这也就是为什么我们叫它做Shell Script的原因(往后我们称为Script)。
不同Shell 的Script基本上会有一些差异,所以我们不能将写给Bourne shell 的Script用C shell 执行。
而在UNIX中大家最常使用Bourne Shell以及C Shell ,所以这堂课就介绍这两种Script的写法。
One、将文本文件设为可执行的Shell Script如果我们已经写好Script,如何将其设成可执行文件呢?因为Script其实是一个可执行文件,所以必须将其存取权限设定成可执行。
我们可以使用下列命令更改存取权限:chmod u+x filename 只有自己可以执行,其它人不能执行chmod ug+x filename 只有自己以及同一群可以执行,其它人不能执行chmod +x filename 所有人都可以执行chmod 744 filenameTwo、使用那一个Shell而我们如何指定使用那一个Shell 来解释所写的Script呢?几种基本的指定方式如下所述:(1)如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell。
(2)如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell。
(3)如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径名称指出来。
这里建议使用第三种方式指定Shell ,以确保所执行的就是所要的。
Bourne Shell的路径名称为/bin/sh ,而C Shell 则为/bin/csh。
除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定。
比如你要用C Shell 执行某个Script,你可以下这个命令:csh filename此时的Script的存取权就不一定要为可执行文件,其内部所指定的Shell 也会无效,详细的情形後面会讨论。
Three、Script的基本结构及观念Script是以行为单位,我们所写的Script会被分解成一行一行来执行。
而每一行可以是命令、注解、或是流程控制指令等。
如果某一行尚未完成,可以在行末加上"\" ,这个时候下一行的内容就会接到这一行的後面,成为同一行,如下:当Script中出现"#" 时,在它後面的同一行文字即为注解,Shell 不会对其翻译。
在Script中要执行一个命令的方法和在命令行中一样,你可以前台或后台执行,执行命令时也会需要设定一些环境变量。
Script的流程控制和一般高级语言的流程控制没有什么两样,也和高级语言一样有子程序。
这些使得Script的功能更加强大。
为了达到与高级语言相同的效果,我们也可以在Script中设定变量,如此使Script 成为名付其实的高级语言。
Four、Bourne Shell一、变量Bourne Shell的变量类型只有字串变量,所以要使用数值运算则必须靠外部命令达成目的。
而其变量种类有下列几种:1. 使用者变量这是最常使用的变量,我们可以任何不包含空白字符的字串来当做变量名称。
设定变量值时则用下列方式:var=string取用变量时则在变量名称前加上一“$”号。
结果如下:nameTom示范:例12. 系统变量(环境变量)和使用者变量相似,只不过此种变量会将其值传给其所执行的命令。
要将一使用者变量设定为系统变量,只要加上:export var以下是使用者一进入系统之後就已设定好的系统变量:$HOME 使用者自己的目录$PA TH 执行命令时所搜寻的目录$TZ 时区$MAILCHECK 每隔多少秒检查是否有新的信件$PS1 在命令列时的提示号$PS2 当命令尚未打完时,Shell 要求再输入时的提示号$MANPATH man 指令的搜寻路径tip Windows 2000的环境变量设置:打开控制面板,双击“系统”,选择“高级”中的“环境变量”。
3. 只读的使用者变量和使用者变量相似,只不过这些变量不能被改变。
要将使用者变量设成只读的,只要加上:readonly var而若只打readonly则会列出所有只读的变量。
还有一点,系统变量不可以设定成只读的。
结果如下:Tomname: is read onlyreadonly namereadonly ......4. 特殊变量有些变量是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它只读的系统变量,而叫它特殊变量(有些书会叫它只读的系统变量),因为这些变量是一执行程序时就有了,况且使用者无法将一般的系统变量设定成只读的。
以下是一些等殊变量:$0 这个程序的执行名字$n 这个程序的第n个参数值,n=1..9$* 这个程序的所有参数$# 这个程序的参数个数$$ 这个程序的PID$! 执行上一个背景指令的PID$? 执行上一个指令的返回值当你执行这个程序时的参数数目超过9 个时,我们可以使用shift 命令将参数往前移一格,如此即可使用第10个以後的参数。
除此之外,可以用set 命令改变$n及$*,方法如下:set string如此$*的值即为string,而分解後则会放入$n。
如果set 命令後面没有参数,则会列出所有已经设定的变量以及其值。
结果如下:Filename: ex1Arguments: this is a testNo. of args.: 42nd arg.: isNo. of args.: 32nd arg.: aArguments: hello, everyone2nd arg.: everyone值得一提的是,当你想从键盘输入一变量值时,你可以使用下面的命令:read var1 var2.....这时read会将一个字分给一个变量。
如果输入的字比变量还多,最後一个变量会将剩下的字当成其值。
如果输入的字比变量还少,则後面的变量会设成空字串。
如果需要处理数值运算,我们可以使用expr命令。
其参数及输出列於附录A。
二、执行命令在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不同。
1. 直接下命令这个方式和在命令列中直接下命令的效果一样。
2. 使用sh命令sh command这个文件案必须是Bourne Shell的Script,但这个文件案并不一定要设成可执行。
除此之外和直接下命令的方式一样。
3. 使用"."命令. command这时和使用sh命令相似,只不过它不像sh一般会产生新的process ,相反地,它会在原有的process 下完成工作。
4. 使用exec命令exec command此时这个Script将会被所执行的命令所取代。
当这个命令执行完毕之後,这个Script也会随之结束。
5. 使用命令替换这是一个相当有用的方法。
如果想要使某个命令的输出成为另一个命令的参数时,就一定要使用这个方法。
我们将命令列於两个"`" 号之间,而Shell 会以这个命令执行後的输出结果代替这个命令以及两个"`" 符号。
结果如下:Current directory is /users/cc/mgtsai这个意思是pwd 这个命令输出"/users/cc/mgtsai",而後整个字串代替原来的`pwd` 设定str 变量,所以str 变量的内容则会有pwd 命令的输出。
number=`expr $number + 1`这就是先前所提要作数值运算的方法,基本上expr命令(expression)只将运算式解,而後输出到标准输出上。
如果要将某变量设定成其值,非得靠命令替换的方式不可。
这个例子是将number变量的值加1 後再存回number变量。
参考附录Aexpr命令增量计数expr在循环中用于增量计算。
首先,循环初始化为0,然后循环值加1,反引号的用法意即替代命令。
最基本的一种是从(expr)命令接受输出并将之放入循环变量。
三、流程控制在介绍流程控制之前,我们先来看看test命令。
test命令的参数是条件判断式,当条件为真时则传回非零值,而条件为伪时则传回零。
在所有的流程控制都必须用到test命令来判断真伪。
而test命令的使用方法则列於附录B。
test $# = 0如果执行这个程序没有参数时,会传回非零值代表"$# = 0"这个条件成立。
反之则会传回零。
以下介绍各种流程控制:1. if then语法以及流程图如下if (condition) thencommandsficondition 是一个test命令。
往後所介绍的各种流程中的condition 都是test 命令。
$ chkarg HelloArg1: Hello2. if then else语法以及流程图如下if (condition) thencommandselsecommandsfi3. if then elif语法以及流程图如下if (condition1) thencommands1elif (condition2) thencommands2elsecommands3fi4. for in语法以及流程图如下for var in arg-listdocommandsdone结果如下:xxyyzz5. for语法以及流程图如下for vardocommandsdone$lstarg xx yy zzxxyyzz结果如下:xxyyzz6. while 语法以及流程图如下while (condition)docommandsdone结果如下:12345678结果如下:01234567897. until语法以及流程图如下until (condition)docommandsdone它和while 的不同只在於while 是在条件为真时执行循环,而until 是在条件为假时执行循环。