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

96 阅读4分钟

基础概念

Shell

  • Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
  • Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
  • Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

Shell 脚本

  • Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

Shell 环境

  • Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

命令和语法

变量

整型、浮点型、日期型需要手动声明

系统环境变量所有shell都是共享或者相同的

当父进程在执行第三方或者核心工具的时候会启动子进程去执行,执行完毕交还给父进程,父进程才继续下一条命令。在这个过程大中锋,自定义变量是只在父进程生效的,另外两个变量父子进程都可以用到

要修改环境变量:vim ~/.bashrc 使命令生效source ~/.bashrc

配置文件加载

shell类型:登录式和非登录式例如输入sh,bash打开的就是非登录式的。非登录式又细分为交互式和非交互式。

交互式:会在终端等待用户输入,处理之后会将结果反馈出来 非交互式:比如输入sh test.sh就会直接执行脚本,没有等待用户输入

运算符和引用

单个括号和反引号是一样的效果;要想命令各自执行就使用分号

比如node server.js &可以让命令在后台运行,不会影响到继续使用。但是如果关闭了当前页面,文件运行也会关闭。如果想要关闭了命令仍然执行,可以使用nohup。即nohup node server.js &

管道

-an查看连接状态。多次使用管道符可以实现连续传递 自己测试:xargs就是将标准输入转化为参数列表的形式,然后交给ls使用

重定向

重定向修改以上默认文件关系fd012输出.2>表示标准错误输出。>符号前边可以加个1,通常情况下可以省略 读取list下的每一行执行while循环,把每一行信息用管道传输给cut 截取文件第1行再传输追加存储到auth.txt文件 循环结束覆盖存储到list.txt

while read -r line; do

echo $line | cut -d " " -f 1 | xargs >> auth.txt

done < ./list.txt

判断命令

分支语句

先判断level是否非空,是的话再判断是否为0为1 连续判断的例子:-o、-e表示或、与的关系

循环

函数

要引用这个函数直接使用即可 用空格间隔方法参数 !,!,!,2表示方法参数

local表示在当前作用域生效;如果不使用local,可以使用unset把变量撤销一下

模块化

常用命令

-A代表before -B代表after -A3 -B3代表搜索出来的前三行和后三行 -f会等待读取下边命令的输入,一般在排查问题的时候使用

执行过程和原理

前提:文件名有可执行权限 前两种会在子进程当中执行脚本,source只会在当前进程执行

执行过程

user部分表示脚本,他在启动之后会交给bash解释器去执行,解释器内部会执行蓝色框框里的几个阶段,经过了字符解析阶段,bash就已经得到了最基本可以执行的命令了。

shell脚本

大括号会在展开的时候和他的前缀、后缀做拼接

调试和前端集成

调试

使用set命令,一般会在shell开头的时候是有 set -uxe -o pipefail

vs code配置

前端集成

可以使用child_process的exec或者spawn去调用shell命令

exec和spawn的区别:

exec会使用子shell去执行传入的命令,并且将结果存到缓冲区。执行完之后将缓冲区的结果返回到函数中。但是这个缓冲区是有大小200KB限制的;

spawn不会启动子shell进程,结果会返回一个流对象,我们直接对这个流对象进行写入和读取。没有大小限制。比较适合大数据量的操作。 node命令启动js脚本:

set -e

node ./exec.js

echo 'success