Shell基础概念、发展基础和构成
基础概念
- tty/终端/终端模拟器:输入输出环境
- Shell:解释器,编程语言。处理终端输入,解释执行后输出结果给终端
- Bash:shell的一种具体实现
Shell 发展
Shell 语法与命令
基本语法可看:bash基本语法指南
变量
自定义变量
= 默认声明变量都是字符串型,支持整型,浮点型,日期型。作用于当前shell。
-
等号两边不能有空格
-
可将命令/命令结果复制给变量
-
因为默认变量为字符串,在默认情况下不会进行+运算
-
可以声明变量为其他型,例:
declare -i xx #将变量声明为整型
环境变量
export declare -x 作用于当前shell及其子shell;
父子shell:当前shell(父进程)在执行第三方/核心工具时,启动子进程执行,子进程执行完后交还给父进程,父进程再执行下一条命令。
系统环境变量 启动加载,作用于所有shell
以上值是在需要启动的时候从环境变量配置文件中读取和初始化,可以用
echo指令查看相关信息:
echo $HOME #当前用户的主目录
echo $USER #用户名
echo $PS1 #配置命令行提示符
echo $PATH #从左到右查找命令的路径
如果需要修改以上默认值:
vim ~/.bashrc #跳转到bashrc文件,进行修改
source ~/.bashrc #修改后不会立刻生效,需要重启终端胡总和执行source命令
配置文件加载过程
- login shell 例如ssh远程登录一台主机
- non-login shell:登录之后使用的shell
- 交互式:直接与用户交互
- 非交互式:用户让shell执行另一个shell,此时另一个shell属于非交互式shell
运算符和引用
管道
管道与管道符|:将前一个命令的结果传递给后面的命令
语法:cmd1|cmd2 #右边的需要是标准输入,ls、mv可以用预处理命令xargs
管道命令中如果出现错误的话是不会报错的。如需修改在命令前加set -o pipefall 遇到错误就退出
重定向
重定向可以将shell中标准输入fd0,标准输出fd1,标准错误fd2原本分别指向终端输入,终端输出,终端输出 的形式修改成指向不同的输出
- 输入重定向符号
- <
- <<
- 输出重定向符号
- >:覆盖写入文件
- >>:追加写入文件
- 2>:错误输出写入文件
- &>:正确和错误输出同一写入到文件中
判断命令
test,[,[[:进行整数测试,字符串测试,文件测试
注意:
- 中括号前后要有空格符
- [和test是命令,只能用自己支持的标志位
- 中括号里的变量最好用引号括起来
- [[更丰富,在整型中支持< > =,在字符串中支持=~正则
分支语句
-
if
if condition ; then 程序段 elif condition ; then 程序段 esle 程序段 fi -
case
case $变量 in: "第一个变量内容") #分支1 程序段 ;; "第一个变量内容") #分支2 程序段 ;; *) 程序段 #默认分支 ;; esac
循环
-
while 循环
while condition ; do 程序段; done -
until 循环(和while'循环相反,表示条件成立的时候跳出循环)
until condition ; do 程序段; done -
for 循环
#方式一 for 变量 in a b c #将a b c三个值分别赋给变量,进行循环 do 程序段; done #方式二 for ((i=0;i<100;i++)) do 程序段 done
函数
funcName(){程序段;}function funcName(){程序段;}
注意
- 函数必须在使用前定义
- 函数获取变量和shell script类似,1 $2获取
- 函数内return仅表示函数执行状态,不表示函数执行结果
- 返回结果一般使用echo,printf,在外使用$(),``获取结果
- 如果没有return,函数状态是上一条命令执行状态,储存在$?中
模块化
在当前shell中执行另一个shell文件
source [函数库的路径]
常用命令如图
执行过程和原理
如何写和启动
1.首先第一行需要指定用什么命令解释器执行,一般是以下两种任选:
#!/bin/bash
#! /usr/bin/env bash
2.启动方式:以下三种任选
./filename.sh #文件名运行,在子进程中执行
bash ./filename.sh #解释器运行,在子进程中执行
source ./filename.sh #source运行,在当前进程中执行
执行过程
- 字符解析
- shell 展开
- 重定向
- 执行命令
- 收集状态并返回
shell 展开
- 大括号展开 {字符串序列或者表达式序列}
- 波浪号展开 ~ #当前用户主目录的值
- 参数展开 {!} 参数长度${#} 空参数处理 参数切片 参数部分删除
- 命令替换 $(...)or`...`
- 数学计算 $((...))
- 文件名展开:当单词没有被引号包裹而且出现了*、?。[字符,则shell会按照正则匹配方法查找文件名进行替换,如果没有找到则保持不变
调试和前端集成
调试
- echo,printf
- set命令
- vscode debug插件
前端继承
-
node中通过exec,spawn调用shell命令
-
shell中脚本调用node命令
-
借助zx等库进行融合