man bash
1. shell 的工作原理 (1)
内核 <---> shell <---> 用户
父进程 fork --> wait
子进程 exec --> exit
相关man文档:
fork(2)
clone(2)
execve(2)
exit_group(2)
exit4(2)
strace(1) -->strace -e
2. shell 语法 (2)
1. 简单命令 (kw: Simple Commands)
基本形式:command [arg]...
范例:
cd
ls -l
cp /data/log /backup/log
2. 管道 (kw: Pipelines)
基本形式:cmd1 | cmd2 | cmd3 -->管道+小命令=复杂命令
左边命令的标准输出作为右边命令的标准输入
用|&代替|,可以把标准错误也一起传给右边
管道中的每一个命令都在子进程中执行
管道中的命令同时运行
管道的返回状态是管道最右边的命令的返回状态
范例:
ls /students|wc -l
ip a| grep -w inet
3. 列表 (kw: Lists)
一系列的管道就是列表
列表中用于分割管道的符合有:
;: 命令按顺序从左到右执行
&: 命令同时执行
&&: 左边成功才执行右边
||: 左边失败才执行右边
列表的结尾可以有; &,如果是&,则最右边的管道放在后台执行
4. 复合命令 (kw: Compound Commands)
(list) 列表作为一个整体在子进程中执行
{ list; } 列表作为一个整体在当前进程中执行
((expression)) 算术运算
((n++))
((total=$first + $last))
[[ expression ]] 当表达式为真时,返回0,否则返回非0,支持正则
if, case, for, while 这些都是shell的流程控制指令
3. 引用 (1), (kw: QUOTING)
shell 中的引用符号用于去除特殊字符的特殊意义
1. 双引号 不能转义 $
2. 单引号 转义所有的符合,除了'本身
3. 反斜杠 单个字符
4. 参数 (2), (kw: PARAMETERS)
Shell 参数是存放“值”的“东西”,它可以是一个名字,一个数字,或者是一些特殊符号。
1. 变量
2. 位置参数 (kw: Positional Parameters)
3. 特殊参数 (kw: Special Parameters)
$*: 所有位置参数合并成的一个字符串
[email protected]: 所有位置参数,如果放在双引号里面,则保存参数的边界
4. shell 内置变量 (kw: Shell Variables)
5. 阵列 (kw: Arrays)
a=(e1 e2 e3)
declare -A a
a[x]=1
a[y]=2
${name[0]} <-- 获取第0个元素
${#name[*]} <-- 阵列的长度
${!name[*]} <-- 阵列的keys
${name[*]} <-- 阵列的values
unset name <-- 删除整个阵列
unset name[0] <-- 删除阵列中的一个元素
5. 展开 (2), (kw: EXPANSION)
shell 在执行命令之前,会对读到的命令行字符串做一系列的展开操作,常见的展开操作有:
1. 大括号展开 (kw: Brace Expansion)
{1..10}, {1..10..2}, {a..z}
d{1,2,3} -> d1 d2 d3
$ cp -v /tmp/a/b/c/deep{,2}
‘/tmp/a/b/c/deep’ -> ‘/tmp/a/b/c/deep2’
2. 波浪号展开 (kw: Tilde Expansion)
~: 当前用户的家目录
~user:指定用户的家目录
~+: 当前工作目录
~-: 上一个工作目录
3. 参数展开 (kw: Parameter Expansion)
$, ${name}
${name:-default} <-- 默认值
${name:offset} <-- 截取字符串
${name:offset:length} <-- 截取一定长度的字符串
${#name} <-- 计算字符串长度
${name#word} <-- 删除字符串头部
${name%word} <-- 删除字符串尾部
${name/pattern/string} <-- 字符串替换
${name^pattern} <-- 转换成大写
${name,pattern} <-- 转换成小写
4. 命令替换 (kw: Command Substitution)
$(cmd list) <-- 当前应该使用这个
`cmd list` <-- 过时语法
5. 算术展开 (kw: Arithmetic Expansion)
$((expression)) <-- 当前应该使用这个
$[expression] <-- 过时语法
6. 进程替换 (kw: Process Substitution)
<(cmd list)
>(cmd list)
7. 路径名展开 (kw: Pathname Expansion)
*, ?, []
能展开则展开,不能展开则保持原样
6. 重定向 (1.5), (kw: REDIRECTION)
在一个命令执行之前,它的输入和输出可能被shell重定向,重定向操作有以下功能:
重定向输入 (kw: Redirecting Input, Here Documents, Here Strings)
wc -l < file
cmd <<EOF
..
EOF
cmd <<< "string"
重定向输出 (kw: Redirecting Output)
复制文件描述符 (kw: Duplicating File Descriptors)
exec 4>&3 <-- 把3 复制成4
移动文件描述符 (kw: Moving File Descriptors)
exec 4>&3- <-- 把3 移动到4
关闭文件描述符
exec 3>&- <-- 关闭3
以读写方式打开文件描述符 (kw: Opening File Descriptors for Reading and Writing)
exec 3<>file <-- 以读写形式打开
0 stdin
1 stdout
2 stderr
7. 算术运算 (0.5)
bash shell 支持整数算术运算
1. ((expression)) (kw: ARITHMETIC EVALUATION)
2. $((expression)) (kw: Arithmetic Expansion)
3. 小数运算
bc, python, awk
8. 简单命令的展开 (0.5), (kw: SIMPLE COMMAND EXPANSION)
shell 执行简单命令时,在实际执行之前,会做以下操作:
1. 取出变量赋值和重定向部分
2. 对余下部分做展开操作
3. 执行重定向操作
4. 执行变量赋值操作
简单命令展开完后,如果展开的结果中有命令名,则流程去到“命令的执行”阶段。
9. 命令的执行 (1), (kw: COMMAND EXECUTION)
1. 如果命令名不包含斜杠,就按顺序搜索命令:
1. 函数
2. 内部命令
3. 搜索PATH 中的目录
2. 如果搜索成功,或者命令名包含了斜杠,则开始执行。
3. 如果搜索失败,或者程序文件不存在,则返回127。
10. 命令的执行环境 (0.5), (kw: COMMAND EXECUTION ENVIRONMENT)
1. 打开的文件
2. 当前工作目录
3. umask
4. 信号trap -->进程通讯
5. shell 变量
6. shell 函数
7. shell 的功能选项(set, shopt) set -o vim/emacs
8. shell 別名
9. 各种进程ID ($$, $PPID)
11. 环境变量 (0.5), (kw: ENVIRONMENT)
当一个命令被执行的时候,会有一个字符串阵列(列表)传给它,这个阵列叫做“环境”,也叫“环境变量”。
shell 的环境变量可以传给子进程。设置shell 的环境变量的命令:
1. export
export time <-- 把time 设置成环境变量
export -n time <-- 使time 编程非环境变量
2. declare
declare -x time <-- 把time 设置成环境变量
declare +x time <-- 使time 编程非环境变量
12. shell 的内部命令 (4.5), (kw: SHELL BUILTIN COMMANDS)
shell的内部命令默认在当前进程执行,常用的有
01. : 空命令
02. ., source
点命令(source)把文件里面的代码读到“当前进程”中执行。
03. break, continue
break <-- 结束整个循环
continue <-- 结束当前循环,进入下一轮循环
04. cd, pwd
cd <-- 必须是内部命令
05. declare, export, readonly, local
06. set, unset, shopt -》set改变shell的开关
07. echo, read, printf
08. exec
09. exit, return
10. kill, trap
11. shift
12. test, [
13. wait
原文地址:http://blog.51cto.com/395469372/2097407