shell | 青训营笔记

69 阅读1分钟

shell中的分支语句

语法1 IF condition;then 程序段 elif condition;then 程序段 else 程序段

语法2

image.png

三种循环

while循环

unitil循环

for循环

image.png

函数

image.png

模块

image.png

执行过程和原理

  1. 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,其中引用的参数并不是parameter而是parameter的实际的值2.参数长度{!parameter},其中引用的参数并不是parameter而是parameter的实际的值 2. 参数长度{#parameter}

  1. 空参数处理

    S{parameter:-word}#为空替换

    {parameter:=word#为空替换,

    parameter:?word)#为空报错

    {parameter:+word}#不为空替换

swift
复制代码
  1. 参数切片

    {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会去按照正则匹配的方式查找文件名进行替换,如果没找到则保持不变