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

70 阅读3分钟

基础概念

  • 终端:获取用户输入,展示运算结果的硬件设备
  • tty: 和终端等价 在 Linux 中是输入输出环境
  • 终端模拟器: 比如 Mac中的 iTerm2等 关联虚拟tty的输入输出软件
  • Shell: 可以处理来自终端模拟器的输入,解释执行后输出结果给终端,也是一种编程语言
  • Bash: Shell的一种具体实现

shell构成

解释器

  • bash内置命令 [ echo let read等 man builtin
  • GNU核心工具集 ls mv cat 等 type mv=>/bin/mv
  • 第三方库 node,python等封装的模块

编程语言

  • 变量:自定义变量,环境变量,系统环境变量

图片1.png 自定义变量

图片2.png 系统环境变量

图片3.png

  • 运算:逻辑运算符,算数运算符
  • 语句:判断,分支,循环

判断

if test-commands; then
    branch-commands;
[elif more-test-commands; then
    more-brach-commands;
]
[else
    alternative-commands;
]
fi
  1. [ ] 表示 elif 和 else 分支是可选的部分,不是语法的一部分。
  2. 单词 commands 用了复数,代表这部分可以是多个命令。
  3. if ... fi 用关键字的镜像作为该结构的起止标志符。
  4. test 命令是一个专门用于条件判断的内置命令,它支持一系列条件表达式,当条件成立时退出码为 0,不成立时为 1。
test expr

# 或者使用简写
[ expr ]

# 还有一种拓展的test,在原有的基础上支持了正则匹配
[[ expr ]]
  • 函数

语法和命令

  1. Hello Shell

hello.sh

#!/bin/bash

echo "Hello Shell!"
  1. 管道
  • 管道与管道符 | 作用是将前一个命令的结果传递给后面的命令
  • 语法:cmd1 | cmd2
  • 要求:管道右侧的命令必须能接受标准输入才行 比如 grep命令,ls,mv 等不能直接使用, 可以使用xargs 预处理
  • 实例
#!/bin/bash
cat platform.access.log | grep ERROR
netstat -an | grep ESTABLISHED | wc -l
find . -maxdepth l -name "*.sh" | xargs ls -l

3.重定向

输出重定向符号
>:将命令的输出重定向到一个文件中 ,如果文件不存在则创建 ,如果文件已经存在则覆盖
>>:将命令的输出重定向到一个文件中 ,如果文件不存在则创建 ,如果文件已经存在则在文件末尾追加
2>:将命令的错误输出重定向到一个文件中 ,如果文件不存在则创建 ,如果文件已经存在则覆盖
&>:将命令的输出和错误输出重定向到一个文件中 ,如果文件不存在则创建 ,如果文件已经存在则覆盖

输入重定向符号
<:将一个文件的内容作为命令的输入
<<:将一段字符串作为命令的输入

  1. 执行
  • shell脚本一般以.sh结尾
  • 可以没有代码(第一行需要指定使用什么命令解释器来执行)
  1. 启动方式
# 文件名运行
./test.sh
# 解释器运行
bash ./test.sh
# source 运行
source ./test.sh

Shell脚本编程的注意事项

  • 变量的作用域:Shell脚本中变量的作用域有时比较复杂,需要注意变量的作用范围。
  • 命令的返回值:Shell脚本中的命令通常会返回一个值,需要注意命令的返回值,以便进行后续的处理。
  • 错误处理:Shell脚本中可能会出现各种错误,需要考虑如何处理这些错误,以保证程序的正常运行。