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类似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 只要发生错误就停止运行
- VS Code Debug插件
前端集成
1. node 中exec spawn 调用shell命令
2. Shell脚本中调用node命令
3. 借助zx等库进行JS Shell Script的融合
—借助shell完成系统操作,文件IO、内存、磁盘系统状态
—借助nodejs完成应用层能力,网络IO、计算等