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

46 阅读4分钟

Shell 脚本和编程(前半部分)

学习 shell 的价值

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

语法和命令

变量

类型作用域声明方式规范
自定义变量当前shell=字符串、整型、浮点型、日期型
环境变量当前shell及其子 shellexport、declare -x
系统环境变量所有shell启动加载

自定义变量

declare选项
选项含义
-给变量设定类型属性
+取消变量的类型属性
-a将变量声明为数组类型
-i将变量声明为整数型
-x将变量声明为环境变量
-r将变量声明为只读变量
-p显示指定变量的被声明的类型

系统环境变量

变量名含义常见操作
$0当前 shell 名称/脚本名称11、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,则继续执行 cmd2cmd1 || cmd2
&&cmd1 执行完且返回码为0,则继续执行 cmd2cmd1 && 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语句。

  1. 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是需要执行的命令或者代码块
    
  2. 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也有帮助,总之意义是很大的。