语法和命令
1.分支语句
语法1:
if condition ;then
程序段
elif condition;then
程序段
else
程序段
fi
语法2:
case $变量 in:
"第一个变量内容")
程序段
;;
"第一个变量内容")
程序段
;;
*)
程序段
;;
esac
2.循环
- while循环
while condition;do 程序段;done
- until循环
until condition;do 程序段;done
- for循环
for var in [words...];do 程序段; done
3.函数
语法一: funcName(){echo "abc";}
语法二: function funcName(){echo "abc";}
注意:
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,1、$2...获取
- 函数内return 仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用echo、printf,在外面使用$0、``获取结果
- 如果没有return,函数状态是上一条命令的执行状态,存储在$?中
4.模块化
模块化的原理是再当前shell内执行函数文件,方式: source[函数库的路径]
5.常用命令
执行过程和原理
1.执行
shell脚本一般以.sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行
#! /bin/bash
#! /usr/bin/env bash
启动方式:
# 文件名运行
./filename.sh
# 解释器运行
bash ./filename.sh
# source 运行
source ./filename.sh
2.执行过程
1.字符解析
- 识别换行符、分号(;)做行的分割
- 识别命令连接符(||&&管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
2.shell展开,例如{1..3}解析为123
3.重定向,将stdin、stdout、stderr的文件描述符进行指向变更
4.执行命令
- builtin直接执行
- 非builtin使用$PATH查找,然后启动子进程执行
5.收集状态并返回
3.shell展开
- 大括号展开(Brace Expansion){...}
- 波浪号展开(Tilde Expansion) ~
- 参数展开(Shell Parameter Expansion)
- 命令替换(Command Substitution)
- 数学计算(Arithmetic Expansion) $((..))
- 文件名展开(Filename Expansion) * ? [..]外壳文件名模式匹配