22 年下半年接触了很多关于运维的知识,涉及到一些 shell 以及 Node 的知识点,汇总一下

# Node 中执行 shell

Node 中提供了 子进程 的模块,可以利用子进程中的方法来实现系统 linux 命令调用,简单示例:

const { execSync } = require("child_process");
const CMD = "git config --get user.name";
const name = execSync(CMD).toString().trim();

以上的代码就类似于,在 zsh 或者命令行终端中执行命令一样,只不过是通过 Node 来执行。

# 传参

首先 shell 可以类似于 Node 执行 js 脚本的时候传参,例如:

  • 执行 node ./index.js jack 20

index.js

// 获取name和age的参数
const [, , name, age] = process.argv;
  • 执行 sh index.sh jack 20

index.sh

# $1为第一个参数 "jack"
# $2为第二个参数 "20"
# $n以此类推

# 定义变量

ENABLE_CDN="1"

# 条件判断

简单的判断

if [[ $ENABLE_CDN = "1" ]]; then
    echo "开启"
fi

# 导出变量

export ENABLE_CDN=true

# webpack在依赖Node构建编译的时候,可以通过process.env.ENABLE_CDN来获取变量
# 如果页面组件中需要这个变量,也可以在webpack打包的文件中通过define插件来复制到框架中

# 递归创建文件夹

当我们需要在为构建的产出做文件命名空间分割的时候,多层目录递归创建

mkdir -p /output/source/name-space/xx

# 移动和复制文件

mv 源文件 目标文件
cp 源文件 目标文件

# 打 tar 包和解压缩包

打包 将当前目录下的 pkg 文件夹打为 pkg.tar.gz

tar zcvf pkg.tar.gz ./pkg

解包 将 pkg.tar.gz 解压到 当前 pkg 目录

tar zxvf pkg.tar.gz -C ./pkg

# 判断文件存不存在

判断当前文件是否存在,不存在则退出

if [[ ! -f "./index.js" ]]; then
    echo "missing index.js"
    exit 1
fi

# 根据文件更新时间排序(倒序)

ls -lt

举个实际的例子:获取当前文件夹下,时间最新的一个 JSON 文件名

ls -lt | grep '.json$' | head -n 1 | awk '${print $9}'

这句话的意思是:先按顺序倒排,然后过滤出来以.json 为后缀的文件,并且去最新的一条,通过 awk 分割获取文件名称

# 获取 JSON 文本数据

假设有个 index.json 文件

{
  "errno": 1,
  "result": "okk"
}

实际 shell 是通过 py 来执行和获取 index.json 格式的数据

RESULT=less ./index.json | python -c "import sys, json; print json.load(sys.stdin)['result']"

这里就能得到 index.json 中 result 的结果 echo $RESULT -> okk

# awk

awk 可以来过滤和处理文本,$1,$2... 可以理解为 awk 按照某一个词作为分割之后的元素,假如有 index 文本

"楼栋" "单元" "楼层"
12 6 102
3 8 502

我们需要组合成 12-6-102 以及 3-8-502 这种格式

cat ./index | awk -v FS=' ' -v OFS='-' '{print $1,$2,$3}'

其中 FS 指定的是分割的符号,默认 FS 为空格,所以以上可以精简为

cat ./index | awk -v OFS='-' '{print $1,$2,$3}'

OFS 是最后需要输出的连接格式,如果只需要后面两位,那就是 {print $2,$3},并且 awk print 后面可以进行简单的算术运运算

cat ./index | awk '{print $1+$2+$3}'

# 获取其他命令返回值

举个例子,如果我们在 shell 中调用了一段 js 代码,虽然 js 在 node 环境中可以抛出失败或者成功,但是因为不同的进程, shell 无法知道那段程序是否异常或者正常退出,这个时候就需要 shell 拿到 js 执行的结果

index.js

fetch()
  .then((res) => {
    // 程序执行成功退出
    process.exit(0);
  })
  .catch((err) => {
    // 程序执行异常退出
    process.exit(1);
  });

sh

node ./index.js

NODE_RESULT=$?

$? 就是 js 执行之后的返回值,返回的数据就是 exit 中抛出的状态,当获取到 $? 之后,就可以根据上一步的结果来处理下边的逻辑,当上一步执行结果为 1 的时候是异常,此时 shell 也 exit 1 以执行失败退出

if [[ $NODE_RESULT -eq 1 ]]; then
    echo "node结果执行失败"
    exit 1
fi

# 查阅改变的日志文件

用来查阅正在有请求进来的日志文件

tail -f filename

# 截取字符串

假如我们需要截取一个字符串,可以利用 ${变量: start: end} 来进行

# 获取当前系统node的主要版本号

NODE_VERSION="$(node -v)"
# 这样获取的是v18.12.1,但是我们只需要18,所以

MAIN_VERSION=${NODE_VERSION: 1: 2}

echo "$MAIN_VERSION"

# 就能得到需要的版本号18

# 以 js 写 shell 脚本的 zx

  • 它是一个 js 脚本不是 shell,文件以 .mjs 结尾
  • shebang 需要指明为 #!/usr/bin/env zx
最后更新: 2/12/2023, 7:42:22 AM