课程准备
- 一台安装了 linux 系统的物理机或者云主机
- 可运行 shell 脚本
- 本地的 vscode 安装 Bash Debug 插件,并升级 bash 到4.x以上
- Npm 全局安装 zx 依赖
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell的基本概念
Shell 关键字
- echo:打印文字到屏幕
- exec:执行另一个 Shell 脚本
- read:读标准输入
- expr:对整数型变量进行算术运算
- test:用于测试变量是否相等、 是否为空、文件类型等
- exit:退出
Shell 变量
Shell 变量分为 3 种: 1. 用户自定义变量 2. 预定义变量 3. 环境变量
定义变量需要注意下面 2 点: 1. 等号前后不要有空格:NUM=10 2. 一般变量名用大写:M=1
使用 $VAR 调用变量:
echo $VAR1
shell 担任的工作
- 读取输入和语法分析命令列
- 对特殊字符求值
- 设立管线、转向、和幕后处理
- 处理讯号
- 设立程序来执行
Bash的历程
命令的语法
shell中特殊字符
| 特殊字符 | 功能 | 说明 | 注意 |
|---|---|---|---|
| # | 1.注释 2.声明命令解释器的类型 3.某些特定的模式匹配操作使用 | 1.注释方面:一般是行首中以 #作为开头 2.声明解释器类型一般是在脚本第一行。使用格式:#!/bin/bash | 命令不能和注释在同一行上,也就是注释的后面 |
| ; | 命令分隔符,可以在同一行上写多个命令 | 某些情况需要使用转义符转义 | |
| ;; | 双分号,终止case选项 | ||
| . | bash内置命令 | 1.点(.)放在文件名前面表示隐藏文件。 2.移动文件操作时,如果是单独点作为参数cp cxx/helloworld.sh .表示当前工作目录 3.两个点(..),表示上一级目录。 4.正则表达式中作为匹配任何的单个字符 | |
| " " | 双引号表示字符串 | ||
| ' ' | 单引号表示字符 | ||
| , | 逗号操作符 | 链接一系列操作 | |
| \ | 反斜杠() | 对单个字符的引用机制 | 一般用来转义双引号(" ") 和单引号(' ')。 |
| / | 正斜杠(/) | 1.作为文件名路径分隔符/data/cxx/Makefile 2.用作除法算术操作符 | |
| * | 1.乘法算术操作符 2.两个(**)表示求幂运算符 3.通配符,可以用来匹配给定目录下的任何文件名 | ||
| ? | 1.测试通配符 2.通配符,在正则表达式中表示一个字符,也可以用来匹配单个字符。 | 在表达式中测试一个条件的结果,类似C语言中的三元操作符。 | |
| $ | 1.引用变量 2.正则表达式中,表示行结束符。 | ||
| ${} | 参数替换 | ||
| @ | 位置参数 | ||
| $$ | 进程ID变量 | 保存所在脚本的进程ID | |
| $? | 退出状态码变量 | 可保存命令、函数或者脚本本身的退出状态码 | 一般是0或 1。 |
| { } | 大括号,代码块,也叫作内部组。 | 在函数或者判断语句中使用代码块 | 在大括号中不允许有空白,除非空白被引用或者转义 |
| [ ] | 1.测试条件 2.数组元素 3.字符范围 | 作为字符范围时,方括号描述一个匹配的字符范围 |
&> >& >> < <> | 重定向
转义符
转义符是一种引用单个字符的方法。添加转义符(\) 使得shell中的某个字符失去原有特殊含义。
注意:在echo 和 sed 中谨慎使用转义符,否则会有相反效果。
赋值给变量的字符串的元素也会被转义, 但是不能把一个单独的转义符赋值给变量。
shell中参数
$0、$?、$!、$$、$*、$#、$@
| 字符符号 | 功能(用途) |
|---|---|
| $0 | shell文件本身的文件名 |
| n | 添加到Shell的各参数值。2是第2参数、…、$n表示第n个参数。⚠️注意:10以上要用大括号,如{10}。 |
| $? | 最后运行命令的结束代码(返回值),执行成功返回0,不成功则返回非零值(一般解释为错误码)。 |
| $$ | Shell本身的PID(ProcessID) |
| $! | Shell最后运行的后台Process的PID |
| $- | 使用Set命令设定的Flag一览 |
| $* | 所有参数列表。如 "1 n" 的形式输出所有参数。 |
| $@ | 所有参数列表。如 "1" "n" 的形式输出所有参数。 |
| $# | 添加到Shell的参数个数 |