shell脚本语法总结
过程式编程语言:
顺序执行 选择执行 循环执行
shell默认是顺序执行,如果有判断或循环语句则执行判断或循环。
条件判断
if 单分支 if 判断条件:then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if CONDITION1; then if-true elifCONDITION2; then if-ture elifCONDITION3; then if-ture ... else all-false fi 逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句 if取的是判断语句的运行状态返回值。true or false case case 变量引用 in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) #任意长度任意字符 (最终会匹配的条件)可以不写这个条件 默认分支 ;; esac ===================================================== pat)通配模式 case支持glob风格的通配符: *: 任意长度任意字符 ?: 任意单个字符 []:指定范围内的任意单个字符 a|b: a或b 注case 分支语句要用双分号结尾。 case中的patter后的分支语句通过golb通配case引用的变量,匹配则执行分支语句。不匹配则往下执行。
循环
for for循环 循环条件是列表不为空,列表中的数据用完则循环结束 for 变量名in 列表;do 循环体 .. done 执行机制: 依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 while while CONDITION; do 循环体 done CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环 因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正 进入条件:CONDITION为true; 退出条件:CONDITION为false until ntil循环 条件为假时开始循环,条件为真时结束循环。 until CONDITION; do 循环体 done 进入条件:CONDITION 为false 退出条件:CONDITION 为true CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
continue
用于循环体中---提前中断循环体的本轮运行 continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层 while CONDTIITON1; do CMD1 ... if CONDITION2; then continue fi CMDn ... done
break—跳出循环 ,并停止整个循环。默认是1
break 后可以加数字 --用于循环体中,可以指定跳出那一层循环(存在嵌套循环)。 break [N]:提前结束第N层循环,最内层为第1层 while CONDTIITON1; do CMD1 ... if CONDITION2; then break fi CMDn ... done
创建无限循环
while true; do5 循环体 done until false; do 循环体 Done
exit
只要在脚本中出现exit则脚本退出执行。 如果在脚本的子shell中出现exit则退出子shell脚本运行。
交互–用户输入
select 属于循环语句 select variable in LIST do 循环体命令 done 运行后,用户按提示(根据in后面的列表生成的菜单)输入选择,则将select将后面的变量名赋值为对应的in列表中的值。 elect 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入 用户输入菜单列表中的某个数字,执行相应的命令 用户的输入 被保存在内置变量REPLY 中。 常配合case使用 read 使用read来把输入值分配给一个或多个shell变量: -p指定要显示的提示 -t TIMEOUT read从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量 read -p “Enter a filename:“ FILE
函数
函数function是由若干条shell命令组成的语句块 实现代码重用 模块化编程 机构化编程 把独立功能的代码当作一个整体,并为之一个名字;命名的代码段,此即为函数; 函数命名应尽量避免与命令或系统关键字重名。命名法则与变量相同 语法一: function f_name{ ...函数体... } 语法二:(常用) f_name() { ...函数体... } 函数的使用 函数的定义和使用: 可在交互式环境下定义函数 可将函数放在脚本文件中作为它的一部分 可放在只包含函数的单独文件中,使用source或点号调用函数文件。 调用:函数只有被调用才会执行; 再脚本中调用:给定函数名;函数名出现的地方,会被自动替换为函数代码 交互式环境下,注销函数 使用 unset 函数名 函数支持位置参数变量和特殊变量;在脚本中,脚本的位置参数变量和特殊变量与其内部函数的位置参数变量和特殊变量不是同一变量,注意区别开 注:函数放在调用函数的代码之前,定义代码段不执行,调用才执行。一般都放到脚本的前面先定义好函数。下面在调用。
return
定义脚本最后一条命令的返回值,多用于给函数定义 例如函数内部有条件判断语句,不同情况下,每个语句都有执行成功的可能。这样可以给每中情况定义不同的状态返回值。
local
定义局部变量 多用于函数内部的变量定义。定义后该变量只在该函数体内部生效。
特殊用法
while循环的特殊用法(遍历文件的每一行):
while read line; do ##read 与用户交互命令 line是个变量可以自定义名称。 循环体 ##处理的内容为line这个变量的内容(文本中的一行)。 done < /PATH/FROM/SOMEFILE #使用标准输入重定向输入文档。 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line 练习 扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功。 双小括号方法,即((…))格式,也可以用于算术运算等于 let EXPRESSION 双小括号方法也可以使bash Shell实现C语言风格的变量操作 #I=10 #((I++))
for循环的特殊格式: help for
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式)) do 循环体 done 控制变量初始化:仅在运行到循环代码段时执行一次,一次循环时初始化变量 控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断 条件判断表达式,可以写的非常简单。 i<=100即可 括号内中的内容需要用分号隔开。 例如for (( i=0;i<=100;i++));do let sum+=$i done echo "$sum" for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done Arithmetic for loop. Equivalent to (( EXP1 )) while (( EXP2 )); do COMMANDS (( EXP3 )) done EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is omitted, it behaves as if it evaluates to 1. Exit Status: Returns the status of the last command executed.
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/38472