Shell脚本和编程 | 青训营笔记

76 阅读3分钟

学习shell的价值

  • Linux服务器的基本操作和管理
  • 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
  • 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署

shell基础概念

物理终端(获取用户输入、展示运算结果的硬件设备)=>软件终端tty(Linux中是输入输出环境)=>终端模拟器(关联tty的输入输出软件)=>shell(处理来自终端模拟器的输入,解释执行之后的输出结果给终端)

构成

image.png 变量

  • 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,必要的时候shell脚本也可以定义环境变量
  • shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,不同类型的变量保证了shell的正常运行

配置文件加载 image (1).png shell运算符

  • 算数运算符:+ - * / | %
  • 关系运算符:只支持数字,不支持字符串,除非字符串的值是数字。
  • 逻辑运算符:|| && !
  • 字符串运算符:
    • = 检测两个字符串是否相等,相等返回 true。
    • != 检测两个字符串是否相等,不相等返回 true。
    • -z 检测字符串长度是否为0,为0返回 true。
    • -n 检测字符串长度是否为0,不为0返回 true。
    • str 检测字符串是否为空,不为空返回 true。
  • 文件测试运算符:用于检测 Unix/Linux 文件的各种属性。

管道与管道符

将前一个命令的结果传递给后面的命令 格式:cmd1|cmd2(管道右侧命令必须能接受标准输入)

输入重定向:是指不使用系统提供的标准输入端口,而进行重新的指定。换言之,输入重定向就是不使用标准输入端口输入文件,而是使用指定的文件作为标准输入设备。(重定向简单理解就是使用 “<”符来修改标准输入设备)

输出重定向:(通俗的讲,重定向输出就是把要输出的文件信息写入到一个文件中去,而不是将要输出的文件信息输出到控制台(显示屏),在linux中,默认的标准输出设备是控制台(或称为显示器),用户输出的信息默认情况下都会显示到控制台

判断命令: shell提供test、[、[[ 三种判断符号,可用于整数测试、字符串测试、文件测试 注意中括号前后要有空格]

分支语句

if条件语句

if [ 条件判断式1 ]

then 当条件判断式1成立时,执行程序1

elif [ 条件判断式2 ]

then 当条件判断式2成立时,执行程序2

…省略更多条件…

else 当所有条件都不成立时,最后执行此程序 fi

case条件语句

case $变量名 in

"值1")
    
如果变量的值等于值1,则执行程序1
    
;;
    
"值2)
    
如果变量的值等于值2,则执行程序2
    
::
    
…省略其他分支…
    
*)
    
如果变量的值都不是以上的值,则执行此程序
    
;;

esac

for循环

for 变量 in 值1 值2 值3 …(可以是一个文件等) ;do 程序 ;done

while循环

while condition ;do 程序 ;done

until循环

until condition ;do 程序 ;done

函数

function 函数名 () { 程序 }

模块化

原理在当前shell里执行函数文件

方式:source[函数库路径]

执行过程与原理

执行过程

  1. 字符解析
  2. shell展开
  3. 重定向,将stdin、stdout、stderr的文件描述符进行变更
  4. 执行命令
  5. 收集状态并返回

shell展开

  1. 大括号展开(Brace Expansion){...}
  2. 波浪号展开(Tilde Expansion) ~
  3. 参数展开(shell Parameter Expansion)
  4. 命令替换(Command Subtitution)
  5. 数学计算(ArithmeticExpansion) $((..))
  6. 文件名展开(Filename Expansion) *?[..]外壳文件名模式匹配