shell中的分支语句
语法1 IF condition;then 程序段 elif condition;then 程序段 else 程序段
语法2
三种循环
while循环
unitil循环
for循环
函数
模块
执行过程和原理
- shell脚本一般以.sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行
字符解析
识别换行符、分号(;)做行的分割 识别命令连接符(||&&管道)做命令的分割 识别空格、tab符,做命令和参数的分割
-
shell展开,例如{1...3}解析为1 2 3
-
重定向,将stdin、stdout、stderr的文件描述符进行指向变更
-
执行命令
builtin直接执行 非builtin使用$PATH查找,然后启动子进程执行
-
收集状态并返回给脚本
shell展开
大括号展开(Brace Expansion)
- 一般由三部分构成,前缀、一对大括号、后缀,大括号内可以是逗号分割的字符串序列,也可以是序列表达式{x..y[..incr]} 波浪号展开(Tilde Expansion)
参数展开(Parameter Expansion)
1、 间接参数扩展{#parameter}
-
空参数处理
S{parameter:-word}#为空替换
{parameter:=word#为空替换,
parameter:?word)#为空报错
{parameter:+word}#不为空替换
swift
复制代码
-
参数切片
{parameter:offset) {parameter:offset:length} 参数部分删除
{parameter%word} #最小限度从后面截取word
{parameter%%word}#最大限度从后面截取word
S{parameter#word}#最小限度从前面截取word
${parameter##word#最大限度从前面截取word
命令替换(Command Substitution)
在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有两种:$(...)或...
数学计算(Arithmetic Expansion)
使用$( ( ) ) 包裹数学运算表达式,得到结果并替换
文件名展开(Filename Expansion)
当有单词没有被引号包裹,且其中出现了‘*’,‘?’,and ‘[’ 字符,则shell会去按照正则匹配的方式查找文件名进行替换,如果没找到则保持不变