调试
1.普通log,使用echo、printf
#!/bin/sh
a=1
d=(1 2 3 4 5)
echo $a
echo ${d[3]}
echo ${d[@]}
#输出
#1
#4
#1 2 3 4 5
2.使用set命令
| set配置 | 作用 | 补充 |
|---|---|---|
| -u | 遇到不存在的变量就会报错,并停止执行 | -o nounset |
| -x | 运行结果之前,先输出执行的那一行命令 | -o xtrace |
| -e | 只要发生错误,就终止执行 | -o errexit |
| -o pipefail | 管道符链接的,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行 |
一般我们会在shell最开头的时候用set进行这些配置,配置项根据不同的shell会有所不同,以上是比较通用的配置项
#!/bin/sh
set -uex -o pipefail
echo "hello world"
3.vscode debug插件
vscode配置
1.shellman:代码提示和自动补全
2.shellcheck:代码语法校验
3.shell-format:代码格式化
与js当中的eslink和prettier相似
4.Bash Debug:支持单步调试
- 安装vscode插件
- 编写launch.json文件
- 升级bash到4.x以上版本
# 1.安装最新版本bash
brew install bash
# 2.查看安装路径
which -a bash
# 3.将新版本bash路径加入PATH
PATH="/usr/local/bin/bash:$PATH"
# 4.配置vscode launch.json启动文件
{
"version":"0.2.0",
"configurations":[
{
"type":"bashdb",
"request":"launch",
"name":"Bash-Debug(simplest configuration)",
"cwd":"${workspaceFolder}",
"program":"debug.sh"
}
]
}
前端集成
1.node中通过exec、spawn调用shell命令
const { exec } = require('child_process');
exec('ls',['-l'],(err,stdout,strerr) => {
if(err){
console.error(err);
}
stdout && console.log(stdout)
})
exec会启动一个子shell去执行传入的命令,并且将命令执行的结果保存在缓存区,执行完毕之后将缓冲区的结果返回到回调函数当中来。缓冲区是有大小限制的,默认是200KB,如果超过这个限制就会报错。
spawn不会启动一个子shell进程,会返回一个流对象,直接对这个流对象进行写入和读取的操作,没有大小限制,所以它比较适合大数据量的操作。
2.shell脚本中调用node命令
#!/bin/bash
set -e
node ./exec.js
echo 'success'
3.借助zx等库进行javascript、shell script的融合
- 借助shell完成系统操作,文件io、内存、磁盘系统状态查询等
- 借助nodejs完成应用层能力,网络io、计算等
#!/usr/bin/env zx
let files=await $`ls -a | grep node`
console.log(chalk.blue(`files : ${files}.`))
await sleep(1000)
await fetch('https://google.com')
let answer=await question('do you want to create new dir ?');
if(answer==='y'){
await $`mkdir temp`
}
===:"严格相等",它比两个等号更严格,将在比较时考虑数据类型。
shell调用:$`command`