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

71 阅读3分钟

Shel 脚本与编程

一.Shell基础概念

终端 == tty

Shell用来处理终端模拟器的输入

Bash是Shell的具体实现

构成:解释、编程语言

二.语法与命令

变量

1.     变量:(1)自定义用“=”

(2)环境变量

(3)系统环境变量

父子Shell

自定义变量:父进程、环境变量的子进程

2.自定义变量

配置文件加载:bashrc

login shell

non-login shell直接加载~./bashrc

更改了bashrc要用source~./重新加载

 

 

运算符与引用

1.     算术

2.     逻辑

3.     引号“”、‘ ’、`` 。分别为部分引用、完全引用、执行引用

4.     圆括号(( ))、( )。分别为算术、命令圆括号。$(ls -a)

5.     命令连接 cmd1与cmd2

|| 前一个不返回0也运行后一个命令

&&前面返回0后面才执行

;一起执行

6.     后台运行 &

弊端是关了bash以后也会运行

Nohub可以阻止这种情况发生

7.     管道 cmd1 | cmd2

前一个的返回值是后一个函数的输入值

要求:管道右侧的命令必须是能接受标准的输入才可以,grep可以,但ls mv不可以

例如:find -maxdepth | -name “*.sh”| xargs ls -l

它会忽略sdterr,用set -o pipefail以取消

 

重定向

输出重定向:>覆盖写入

                   >>追加写入

                   2>错误输出写入文件

                   &>正与错一同输出并写入文件当中

输入重定向:< 、<<

 

判断语句

test  [  [[ 用于

1.     整数判断

2.     字符串判断

3.     文件测试

 

分支语句

语法1:

if condition ; then

elif condition ; then

      程序段

else

      程序段

Fi

      程序段

语法2:

case $变量 in :

      “一个变量”

       程序段

        ;;

      “一个变量”

       程序段

       ;;

       *)//结束

       程序段

       Esac

 

循环

1.     while

while condition ; do 程序段 ; done

2.     until

until condition ; do 程序段 ;done

3.     for

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

 

函数

1.     funname(){echo“abc”;}

2.     function funname(){echo“abc”;}

Notice:

(1)  Shell是自上而下的运行,用函数前先定义好

(2)  获取变量和Shell Script类似0为函数名,后面参数用0为函数名,后面参数用1 $2来获取

(3)  return 返回的值仅为执行状态,不是结果

(4)  返回结果一般用echo或者printf

在外面用$( )、`` 获取结果

(5)  无return,函数状态是上一条命令执行的状态

 

模块化

原理是在当前Shell内执行函数文件

source [路径]

例如:source ‘./~/example.sh’

 

常用命令

1.     gerp 查找错误状态

例:grep -n “ERROR”-A3 -B3 coludfun.log

2.     sort 指定分隔符后以第三列排序

为:sort -t “ ”-k 3

3.     wc 统计出现的行数、单词数、字符数

4.     head(和tail很像) 看前n行 head -n lv cloudfun.log

5.     cut 对数行内容进行处理

cut -d “ ”-f 3

6.     find 文件目录查找

7.     xargs 参数处理

8.     which 查找命令路径

三. Shell执行过程与原理

执行

1.     Shell文件以“.sh”结尾,可有可无,第一行指定用什么命令解释器来执行

为:#! /bin/bash

2.     启动方式

文件名 ./( )

解释器 bash ./( )

source source ./( )

 

过程

1.     字符解析

换行符 ; 做换行分割

识别命令连接符(||、&&、|)

空格,tap符做命令参数分割

2.     展开 例如:{{1 2 3}} => 1 2 3

3.     重定向

4.     执行命令:builtin直接运行

5.     收集状态返回

 

 

 

Shell 展开

1.     大括号{ }

一般由三部分构成、前缀、一对大括号、后缀,大括号内可以是逗号分割的字符串序列,也可以是序列表达式{x..y[..incr]}

字符串:a{b,c,d}e => abe ace ade

{1..5..2} => 1 3 5

数字可以用incr调整增量,但字母不可以

2.     波浪号展开~

~用户目录 +是当前用户 -是上一级

3.     参数展开${ }

(1)  间接参数扩展${!parameter},其中引用的参 数并不是parameter而是parameter的实际的值

(2)  参数长度${#parameter}

(3)  空参数处理

${parameter:-word} #为空替换

{parameter:=word} #为空替换,并将值赋给parameter变量

${parameter:?word} #为空报错

${parameter:+word} #不为空替换

(4)  参数切片

(4)${parameter:offset}

(4)${parameter:offset:length}

 

(5)  参数部分删除

${parameter%word}#最小限度从后面截取word

${parameter%%word}#最大限度从后面截取word

${parameter#word}#最小限度从前面截取word

${parameter##word}#最大限度从前面截取word

4.     命令替换

在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有:$( )或’’

5.     数学计算 echo $((1 + 2))

6.     文件名展开*?[ ]

 

四. 调试和前端集成

调试

1.     log echo printf

2.     set命令

-u 遇到不存在的变量报错并停止运行

-x 运行结果之前,先输出执行的那一行命令

-e 只要发生错误就停止运行

  1. VS Code Debug插件

 

 

 

前端集成

1.     node 中exec spawn 调用shell命令

2.     Shell脚本中调用node命令

3.     借助zx等库进行JS Shell Script的融合

—借助shell完成系统操作,文件IO、内存、磁盘系统状态

—借助nodejs完成应用层能力,网络IO、计算等