一,流程控制
过程式编程语言
a.顺序执行
b.选择执行
c.循环执行
顺序执行
顾名思义,就是按照你脚本里所敲的内容顺序执行
选择执行
fi
a.条件选择if语句,可以嵌套
b.格式
单支
if 判断条件;then
条件为真
fi
双分支
if 判断条件;then
条件为真
else
条件为假
fi
多分支
if 判断条件;then
条件为真
elif(相当于else if) 判断条件;then
条件为真
else
上述条件都为假
fi
逐条进行判断,第一次遇到真条件时,执行分支,然后fi结束整个if语句
看几个例子,了解一下具体在脚本里格式是什么样的
所有的脚本写完之后的操作都一样,就在这里演示一次后面就都不演示了
case
a.case支持glob风格的通配符
* | 任意长度任意字符 |
? | 任意单个字符 |
[ ] | 指定范围内的任意单个字符 |
a|b | a或者b |
b.格式
case 变量引用 in
pat1) 分支;;
pat2) 分支;;
...
*) 分支;;
esac
循环执行
定义:将某代码段重复运行多次,有进入条件和退出条件
for
a.格式
for 变量名 in 赋值列表;do
循环体
done
b.执行机制:依次将列表的元素赋值给变量名,每次赋值后执行一次循环体,知道列表中耗尽,循环结束
c.列表生成方式
(1)直接给出列表 {1,2,3}
(2)整数列表
(a){1..10}
(b)$(seq 1 10)
(3)返回列表的命令 $(cmd)
(4)变量引用 $@,$#
while
a.格式
while 循环控制条件;do
循环体
done
b.循环控制条件是true,进入循环,否则退出循环
c.特殊用法 遍历文件的每一行
while read line;do
循环体
done < 文件名
依次读取文件的每一行,并且赋值给$line
until
a.格式
until 循环控制条件;do
循环体
done
b.循环控制条件是false,进入循环,否则退出循环
continue
用于循环体中,提前结束第N层的本轮循环,进入下一轮N+1层循环
break
用于循环体中,提前结束第N层本轮循环
这俩个是在其他循环语句中应用,在其他示例的图片里一起讲了
shift
shift n
用于参量列表,左移指定次数,不指定为左移一次;一旦被移动,最左端的参数从列表中删除
select 用于创建菜单
a.格式
select variable in list;do
循环体命令
done
b.PS3提示符
c.输入菜单的某个数字,执行相应的命令,是无线循环,需用break退出循环或者exit终止脚本
特殊用法
((...)) 可以用于运算
for ((变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
每轮循环结束会先进行控制变量修正运算,然后再做条件判断
二,函数
函数介绍
不是单独的进程,不能独立运行,是shell程序的一部分,在当前shell中运行
定义函数
a.方式一
函数名 () { 函数体;} 常用
b.方式二
function 函数名 { 函数体;}
c.方式三
function 函数名 () { 函数体;}
函数使用
a.可在交互式环境下定义函数
b.可将函数放在脚本文件中作为它的一部分
c.可放在只包含函数的单独文件
d.函数只有被调用才会执行
函数返回值
return 从函数中返回,用最后状态命令决定返回值,是0,则是无错误返回;是1-255,则是有错误返回
定义及使用函数
a.交互式环境
定义函数后,将一直保留到用户从系统退出,或者执行unset 删除函数,取消函数赋值
b.脚本中
调用函数直接调用函数名即可
载入函数
函数文件创建好后,用 . 或者source 接上文件名载入函数
执行shell函数
直接输入函数名即可
函数参数
可以接受调用$1,$2,...这些参数,还有特殊变量
$@,$* 表示所有的参数
$# 表示参数个数
函数变量
a.环境变量
当前shell和子shell有效
b.本地变量
只在当前函数运行期间有效
c.全局函数
对当前shell有效
函数递归
函数直接或间接调用自身
三,数组
相关数组的含义
a.变量
存储单个元素的内存空间
b.数组
存储多个元素的连续的内存空间,相当于多个变量的集合
c.索引
从0开始,数值索引,declare -a 数组名 声明数字索引
也可以自定义,为关联索引,declare -A 数组名 声明关联索引
数组赋值
a.一次赋值一个元素
title[1]=a
b.一次赋值全部元素
title=(a b c ) 下标自动从0开始排
c.指定下标数
title=([0]=a [3]=b)
d.交互式赋值
read -a 数组名
引用数组
a.引用数组元素
${数组名[下标数]}
b.引用数组所有元素
${数组名[@|*]}
c.数组元素的个数
${#数组名[@|*]}
c.删除数组或者元素
unset 数组名[下标值]
数组数据处理
a.引用数组中元素
${数组名[@] :i:j}
i:为正数时是从左往右跳过i个元素;为负数时是从右往左取出i个元素
j:为正数时是从左往右取出j个元素;为负数时是从右往左去掉j个元素
b.追加元素
数组名[${#数组名[@]}]=元素值
c.关联数组
关联数组必须先声明再调用
d.显示字符串长度
${#数组名}
四,高级字符串操作
基于模式取字符串
${数组名#*字符串} 从左往右开始删除直到第一次出现匹配到字符串的所有字符
${数组名##*字符串} 从左往右开始删除直到最后一次出现匹配到字符串的所有字符
${数组名%字符串*} 跟#用法一样,但是是从右往左开始
查找替换
${数组名/匹配的字符串/替换的字符串} 第一次被匹配到的字符串,替换
${数组名//匹配的字符串/替换的字符串} 所有被匹配的字符串,替换
${数组名/#匹配的字符串/替换的字符串} 行首被匹配的字符串,替换
${数组名/%匹配的字符串/替换的字符串} 行尾被匹配的字符串,替换
查找删除
与替换用法一样,不输入替换的字符串即可
字符大小写转换
${数组名^^} 把数组中的所有小写字母换成大写
${数组名,,} 把数组中的所有大写字母换成小写
五,高级变量
declare
有类型变量
如果declare -a 和 declare -A 后面没有接变量名则表示显示索引数组和关联数组
eval
会先扫描所有的置换,然后执行命令;适用于一次扫描无法实现的变量;对变量进行俩次扫描
mktemp
创建并显示临时文件,可避免冲突
install
安装复制文件
expect
a.介绍
主要应用于自动化交互操作的场景,就是把交互式操作成自动完成
原文:http://blog.51cto.com/13572810/2090670