Shell 脚本和编程(前半部分)
学习 shell 的价值
- Linux 服务器的基本操作和管理
- 前端 Node.js 服务的进程管理、问题排查、资源监控等运维操作
- 使用 shell 编写 TCE、SCM、Docker 脚本,完成服务编译和部署
语法和命令
变量
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前shell | = | 字符串、整型、浮点型、日期型 |
| 环境变量 | 当前shell及其子 shell | export、declare -x | |
| 系统环境变量 | 所有shell | 启动加载 |
自定义变量
declare选项
| 选项 | 含义 |
|---|---|
| - | 给变量设定类型属性 |
| + | 取消变量的类型属性 |
| -a | 将变量声明为数组类型 |
| -i | 将变量声明为整数型 |
| -x | 将变量声明为环境变量 |
| -r | 将变量声明为只读变量 |
| -p | 显示指定变量的被声明的类型 |
系统环境变量
| 变量名 | 含义 | 常见操作 |
|---|---|---|
| $0 | 当前 shell 名称/脚本名称 | 2等可以获取到传入参数 |
| $# | 传入脚本的参数数量 | if[ $# -gt 1 ] |
| $* | 传入脚本的所有参数 | |
| $? | 上条命令执行的状态码 | if [ $? -eq 0 ]; |
| $PS1 | 命令提示符 | export PS1="\u@\h \w>" |
| $HOME | 用户主文件夹 | cd ~ |
| $PATH | 全局命令的搜索路径 | PATH=$PATH:[新增路径] |
运算符和引用
| 类型 | 符号 | 作用 | 用法 |
|---|---|---|---|
| 算数运算符 | + - * / % | & | 常规运算 | |
| 逻辑运算符 | || && ! | ||
| 比较运算符 | == != < > | ||
| 引号 | 双引号” “ | 部分引用,仅仅 $ ` \ 保留作用 | foo="${a}123" |
| 单引号' ' | 完全引用,原样输出 | foo= 'foo$a' | |
| 反引号`` | 执行命令 | foo=ls -a | |
| 圆括号 | (()) | 算数运算 | foo=$((1+2)) |
| () | 执行命令 | $( ls -a) | |
| 命令连接 | || | cmd1 执行完且返回码非0,则继续执行 cmd2 | cmd1 || cmd2 |
| && | cmd1 执行完且返回码为0,则继续执行 cmd2 | cmd1 && cmd2 | |
| ; | cmd1、cmd2 串行执行 | cmd1 ;cmd2 | |
| 后台运行 | & | 让命令在后台运行,可与nohup一起使用 | cmd & |
管道
管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令
语法:cmd1 | cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如 grep 命令,ls、mv等不能直接使用,可以使用 xargs 预处理
注意:管道命令仅仅处理 stdout ,对于 stderr 会予以忽略,可以使用 set -o pipefail 设置 shell 遇到管道错误退出
#!/bin/bash
cat platform.access.log | grep ERROR
netstat -an | grep ESTABLISHED | wc -1
find . -maxdepth 1 -name "*.sh" | xargs ls -1
重定向
输出重定向符号:
>:覆盖写入文件
>>:追加写入文件
2>:错误输出写入文件
&>:正确和错误输出统一写入到文件中
输入重定向符号:
<
<<
判断命令
shell中提供了 test 、[ 、[[ 三种判断符号,可用于:
- 整数测试
- 字符串测试
- 文件测试
语法
- test condition
- [ condition ]
- [[ condition ]]
注意
- 中括号前后要有空格符
- [ 和 test 是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
- 中括号内的变量,最好都使用引号括起来
- [[ 更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则表达式
分支语句
在shell中,分支语句主要有if语句何case语句。
-
if语句
- if语句用于判断条件是否成立,如果成立则执行相应的命令或者代码块。if语句的基本语法如下:
if [ condition ] then command1 command2 ...... commandN fi # condition是需要判断的条件,可以是变量、字符串、数值等,command1到commandN是需要执行的命令或者代码块- if语句可以带有else和elif语句,用于在条件不成立时执行相应的命令或者代码块。if的完整语法如下:
if [ condition ] then command1 command2 ...... commandN elif [ condition2 ] then command1 command2 ...... commandN else command1 command2 ...... commandN fi #condition是需要判断的条件,condition2是第二个需要判断的条件,command1到commandN是需要执行的命令或者代码块 -
case语句
case语句用于根据不同的条件执行相应的命令或者代码块
case variable in
pattern1)
command1
;;
pattern2)
command2
;;
......
*)
commandN
;;
esac
# variable是需要判断的变量,pattern1到patternN是需要判断的模式,command1到commandN是需要执行的命令或者代码块。如果没有任何一个模式匹配,那么就会执行*后面的命令或者代码块。esac是用来结尾的
在shell中,很多语句都有相应的结束标志,比如if语句有fi,for语句有done,while语句有done等等。这些结束标志的作用是用于标识语句的结束位置,避免语法错误
学习感悟
这节课内容讲了shell编程的一些知识,但是由于确实有事没有看完课程后续的内容在后面再补上,这部分内容主要是和前面学习的Linux进行了一个对接,对前端来说,对于后续学习的Node.js也有帮助,总之意义是很大的。