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

123 阅读3分钟

一、Shell基础概念

1.概念

终端——获取用户输入、展示运算结果的硬件设备。

终端模拟器——Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件。

tty——teletypeWriter的简称,和终端等价,早期指电传印机,在linux中是输入/输出环境。

Shell——command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端。

Bash——shell的一种具体实现。

2.发展

  • Ken Thompson《来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell。
  • Stephen Bourne在贝尔实验室为V7 UNIX所开发的Bourne shell,即sh。
  • 开源组织GNU为了取代Bourne shell开发的Bourne-Again shell,即Bash。

3.构成

Shell

  • 解释器
    bash内置命今
    GNU核心工具集
    第三方库
  • 编程语言
    变量
    运算
    语句
    函数

二、语法和命令

1.变量

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

2.自定义变量

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

3.系统环境变量

    变量名                                 含义                  常见操作
    $o                          当前shell名称/脚本名称      $1、$2等可以获取到传入参数
    $#                           传入脚本的参数数量             if[$#-gt 1 ] 
    $*                          传入脚本的所有参数
    $?                          上条命令执行的状态码        if[$? -eq o ];
    $PS1                          命令提示符               export PS1="\u@\h\w> "
    $HOME                         用户主文件夹                   cd ~
    $PATH                       全局命令的搜索路径          PATH=$PATH:[新增路径]

4.运算符与引用

    类型                 符号                   作用                      用法
算数运算符             + 一 * / % │ &          常规运算
逻辑运算符              || && !
比较运算符             == != < > 
                      双引号""             部分引用,仅仅$ ` \ 保留作用   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 &

5.管道

  • 管道与管道符|,作用是将前一个命令的结果传递给后面的命令
  • 语法: cmd1 | cmd2
  • 要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理
  • 注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail 设置shell遇到管道错误退出

6.重定向

输出重定向符号—— >:覆盖写入文件 >>:追加写入文件 2>:错误输出写入文件 &>: 正确和错误输出统一写入到文件中 输入重定向符号—— < <<

7.常用命令

    命令                           使用
   grep                   查找错误日志:grep -n "ERROR"-A3 -B3 cloudfun.log
                           统计次数:grep -n "ERROR" -c cloudfun.log

   sort                      指定分隔符后以第三列进行排序:sort -t " " -k 3

    wc                        统计出现的行数、单词数、字符数: wc -lwm
   head                       查看前十行: head -n 10 cloudfun.log
   tail                    等待追加内容: tail -f -n 10 cloudfun.log
   cut                     对数据行的内容进行处理cut -d " " -f 3
   find                           文件和目录查找
   xargs                          参数处理
   which                         查找命令路径

收获: 通过对本次课程的学习,我了解到了Linux服务器的基本操作和管理、初步学习了前端Node.js 服务的进程管理、问题排查、资源监控等运维操作;初步学会使用shell 编写TCE、SCM、Docker脚本,完成服务编译和部署。