终端:获取用户输入、展示运算结果的硬件设备 终端模拟器:关联虚拟tty的输入输出软件 tty:teletypeWriter的简称,和终端等价,在linux中是输入/输出环境 Shell:处理来自终端模拟器的1输入,解释执行之后的输出结果给终端 Bash:shell的具体体现
管道 管道与管道符|,作用是将前一个命令的结果传递给后面的命令 语法:cmd1|cmd2 要求:管道右侧的命令必须能接受标准输入,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理。 注意:管道命令仅仅处理标准输出,对于标准错误会忽略,可以使用set -o pipefail设置shell遇到管道错误退出,
重定向 输出重定向符号
:覆盖写入文件
:追加写入文件 2>:错误输出写入文件 &>:正确和错误输出统一写入到文件中 输入重定向符号 < <<
判断命令 shell中提供了test、[、[[三种判断符号,可用于整数测试,字符串测试、文件测试。 语法 test condition [ condition ] [[ condition ]] 中括号前后要有空格符; [和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串 中括号内的变量,最好都是用引号括起来 [[更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则
分支语句 语法1 if condition;then 程序段 elif condition;then 程序段 else 程序段 fi
语法2 case$变量 in: "第一个变量内容") 程序段 ;; "第二个变量内容") 程序段 ;; *.) 程序段 ;; esac
循环 while循环 until循环,条件成立时才有循环 for循环
函数 语法1:funcName(){echo"abc";} 语法2:function funcName(){echo"abc";} 注意:返回结果一般使用 echo、printf, 在外面使用 S()、获取结果;函数获取变量和 shell script类似,$0代表函数名,后续参数通过 S1、S2 ...获取
模块化 source[函数库的路径]
执行过程和原理
执行过程
- 字符解析
- 识别换行符、分号(;) 做行的分割
- 识别命令连接符(11 && 管道) 做命的分制
- 识别空格、tab符,做命令和参数的分割
- shell 展开例如[1..3) 解析为 12 3
- 重定向,将stdin、stdout、stderr的文件描述符进行指向变更
- 执行命令 注意 builtin直接执行 非 builtin 使用 SPATH 查找,然后启动子进程执行
- 收集状态并返回 shell 展开
- 大括号展开 (Brace Expansion) {...} 三部分组成,前缀,一对大括号,后缀。例如a{b,c,d}e=>abe ace ade 2.波浪号展开 (Tilde Expansion)
3.参数展开 (Shell Parameter Expansion)$()
1.间接参数扩展 S{!parameter},其中引用的参数并不是parameter而是parameter的实际的值
2参数长度 S#parameter} 3.空参数处理 ${parameter:-word}#为空替换
{parameter:=word} #为空替换并将值赋给parameter变量
${parameter:?word}#为空报错
${parameter:+word}#不为空替换
4.参数切片
${ parameter: offset}
${ parameter: offset: length) a=1
echo (b:-word) echo {par:=word} # word6 echo {par:-hello] # word echo {par:+foo} # foo 5.参数部分删除 S{parameter%word}# 最小限度从后面截取word Sparameter%%word}# 最大限度从后面截取word S{parameter#word}# 最小限度从前面截取word S{parameter##word》# 最大限度从前面截取word 4.命令替换 (Command Substitution) 5.数学计算 (Arithmetic Expansion) ((..)) 使用 $(()) 包裹数学运算表达式得到结果并替换 6.文件名展开 (Filename Expansion) * ?[..]外壳文件名模式匹配