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

57 阅读1分钟

语法和命令

1.分支语句

语法1:

   if condition ;then
        程序段
   elif condition;then
       程序段
   else
       程序段
   fi   

语法2:

   case $变量 in:
   "第一个变量内容")
       程序段
       ;;
   "第一个变量内容")
       程序段
       ;;
   *)
   程序段
   ;;
   esac

2.循环

  • while循环

while condition;do 程序段;done

  • until循环

until condition;do 程序段;done

  • for循环

for var in [words...];do 程序段; done

3.函数

语法一: funcName(){echo "abc";}

语法二: function funcName(){echo "abc";}

注意:

  • shell自上而下执行,函数必须在使用前定义
  • 函数获取变量和shell script类似,0代表函数名,后续参数通过0代表函数名,后续参数通过1、$2...获取
  • 函数内return 仅仅表示函数执行状态,不代表函数执行结果
  • 返回结果一般使用echo、printf,在外面使用$0、``获取结果
  • 如果没有return,函数状态是上一条命令的执行状态,存储在$?中

4.模块化

模块化的原理是再当前shell内执行函数文件,方式: source[函数库的路径]

5.常用命令

image.png

执行过程和原理

1.执行

shell脚本一般以.sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行

#! /bin/bash

#! /usr/bin/env bash

启动方式:

# 文件名运行
./filename.sh

# 解释器运行
bash ./filename.sh

# source 运行
source ./filename.sh

2.执行过程

1.字符解析

  • 识别换行符、分号(;)做行的分割
  • 识别命令连接符(||&&管道)做命令的分割
  • 识别空格、tab符,做命令和参数的分割

2.shell展开,例如{1..3}解析为123

3.重定向,将stdin、stdout、stderr的文件描述符进行指向变更

4.执行命令

  • builtin直接执行
  • 非builtin使用$PATH查找,然后启动子进程执行

5.收集状态并返回

3.shell展开

  • 大括号展开(Brace Expansion){...}
  • 波浪号展开(Tilde Expansion) ~
  • 参数展开(Shell Parameter Expansion)
  • 命令替换(Command Substitution)
  • 数学计算(Arithmetic Expansion) $((..))
  • 文件名展开(Filename Expansion) * ? [..]外壳文件名模式匹配