Shell 脚本和编程(二) | 青训营笔记

146 阅读4分钟

1 目标

  • 学习shell基础和语法,shell执行过程和原理,shell调试和前端集成。

2 常用shell编程的方法

2.1 语句

分支语句

  • shell中分支语句主要是两种:

  • if语句

    • if语句经常用在分支不是很多的场景下,if后面的指令,首先会被执行,然后根据指令的返回状态码进入对应的分支。
      • 如果状态码为0,也就 是指令执行成功,就进去then的部分
      • 非0则进入其他分支。
    • 语法:
    if condition;then  
      程序段
    elif condition;then  
      程序段
      else   
      程序段 
    fi
    

case语句

  • 当分支较多时可以考虑使用case语句
  case $变量 in:
  "第一个变量内容")
 程序段
 ;;
 "第一个变量内容")
 程序段
 ;;
 *)
 程序段
 ;;
 esac

2.2 循环

  • 三种循环类型

  • while循环

  • 只要条件成立,则反复循环,不成立即停止

while 条件测试操作 
do  
   命令序列  
done

  • until循环 重复测试某个条件,只要条件不成立则反复循环
until 条件测试操作  
do    
   命令序列  
done
  • for循环 for循环,又有人称之为条件循环,或者for i in ,其实就是for循环的特性,次数和给与的条件是成正比的。
for 变量名 in 取值列表  
do                     
   命令序列  
done

2.3 函数

  • 将命令序列按格式写在一起,可方便重复使用命令序列语法
 funcName(){echo "abc"}
 function funcName(){echo "abc"}
  • 注意:
    • shell自上而下执行,函数必须在使用前定义
    • 函数获取变量和 shell script类似,0代表函数名,后续参数通过0代表函数名,后续参数通过0代表函数名,后续参数通过1、$2...获取
    • 函数内 return仅仅表示函数执行状态, 不代表函数执行结果
    • 返回结果一般使用 echo、 printf,在外面使用$()、'' 获取结果
    • 如果没有 return,函数状态是上一条命令的执行状态,存储在$?中

函数返回值

  • return表示退出函数并返回一个退出值,脚本中可以用 $ ? 变量显示该值
    使用原则:

  • 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
    退出状态码必须是0~255,超出时值将为除以256取余

2.4 模块化

  • 原理:在当前shell内执行函数文件

    • source [函数库的路径]

常用命令

命令使用
grep查找错误日志:grep -n "ERR0R" -A3 -B3 cloudfun. log 统计次数:grep -n "ERROR" -c cloudfun. log
sort指定分隔符后以第三列进行排序:  sort -t" "-k 3
wc统计出现的行数、单词数、字符数wc -1wm
head查看前10行 head -n 10 cloudfun. log
tail等待追加内容: tail -f -n 10 cloudfun. log
cut对数据行的内容进行处理cut -d " " -f 3
find文件和目录查找
xargs参数处理
which查找命令路径

2.5 执行过程和原理

执行

  • shell脚本一般以.sh结尾,也可以没有。

  • 启动方式三种:

    1. 文件名运行
      • ./filename.sh
    2. 解释器运行
      • bash ./filename.sh
    3. source运行
      • source ./filename.sh

执行过程

  1. 字符解析
  2. shell 展开
  3. 重定向
  4. 执行命令
  5. 收集状态并返回

shell展开

  1. 大括号展开(Brase Expansion) {..}

一般由三部分构成:前缀,大括号,后缀

大括号展开是一种可以生成任意字符串的机制。展开大括号的模式采用可选的前缀,后接一系列逗号分隔的字符串或一对大括号之间的序列表达式,后接可选的后缀。前缀与大括号中包含的每个字符串组合,然后将后缀附加到每个结果字符串,从左到右展开。

  1. 波浪号展开(Tilde Expansion) ~

如果一个单词以未加引号的斜杠字符(’ ~ ')开头,则第一个未加引号的斜杠之前的所有字符(如果没有加引号的斜杠,则所有字符)都被视为波浪前缀。

如果波浪号前缀中的字符都没有被引用,那么波浪号后面的波浪号前缀中的字符将被视为可能的登录名。

如果这个登录名是空字符串,则用shell变量HOME的值替换波浪号。如果没有设置HOME,则替换执行shell的用户的HOME目录。否则,波浪前缀将被替换为与指定登录名关联的主目录。

  1. 参数展开

    • 间接参数扩展${!parameter}
    • 参数长度${#parameter}
    • 空参数处理
      • parameter:−word为空替换
      • {parameter:-word}为空替换
      • {parameter:=word}为空替换,并赋值给parameter变量
      • {parameter:?word}为空报错
      • ${parameter:+word}不为空替换。
    • 参数切片
    • 参数部分删除
  2. 命令替换

    • 命令替换允许命令的输出替换命令本身。
      • $(...)
      • ...
  3. 数学计算(Arithmetic Expansion) $((..))

    • 使用$(())包裹数学运算表达式,得到结果并替换。
  4. 文件名展开(Filename Expansion)

    • ?[..]外壳文件名模式匹配 当单词没有被引号包裹,且出现' ' '?' '['字符,shell会按照正确的方式查找文件名替换,如果没找到保持不变。

2.5 调试和前端集成

调试

  1. 普通log,使用echo,printf
  2. 使用set命令
  3. vscode debug插件

VSCode配置

  • 插件

    1. shellman:代码提示和自动补全
    2. shellcheck:代码语法校验
    3. shell-format:代码格式化
    4. Bash Debug:支持单步调试
  • 前端集成

    1. node中通过exex,spawn调用shell命令
    2. shell脚本中调用node命令
    3. 借助zx等库进行javascript,shell script的融合

3 总结

  • Shell编程是一种在Linux系统中常用的脚本语言,它可以通过编写一些简单的脚本来完成一些复杂的任务。
  • 很开心自己的学习有所产出,以后复习时候也可以拿自己文章来复习,Shell脚本和编程以前学过但是很多细节都忘记了

参考