shell基础
shell概念
shell是用户使用Linux的桥梁,既是命令语言也是一种程序设计语言。通过shell我们来处理终端模拟器的输入,解释执行过后输出给终端。
1971年由Ken Thompson为Unix开发V6 shell,它也是第一种Unix shell。
开源组织GNU为了取代Stephen Bourne为V7 Unix开发的Bourne shell开发出了Bourne-Again shell即Bash,它也是shell的一种具体体现。
shell分解释器和编程语言俩大类;解释器包括:bash 内置命令、GNU核心工具集以及第三方库;编程语言包含了变量、运算、语句、函数。
语法及命令
变量:
- 自定义变量,在脚本或命令中定义,仅在当前shell中有效,其他shell的启动程序无法访问。变量名和变量值=连接,类型有整型,字符串型,浮点型及日期型
- 环境变量,当前shell及其子shell,使用
export declare -x作声明方式。父子shell 由父shell触发子shell,结束后返回继续执行下一条命令。 - 系统环境变量作用在所有shell中,声明方式启动加载。
变量写法
#! /bin/bash
# 变量名=变量值(不能有空格出现)
size=1
num=2
# 命令赋值给变量
ls=ls
# 命令结果赋值给变量
list=$(ls)
# 默认字符串不进行+运算
total=size*num
# 需要声明变量为整型
let total=size*num
declare -i total=size*num
# 导出环境变量
export total
#声明变量为环境变量
declare -x total
| declare [+/-] 选项变量 | |
|---|---|
| 选项 | 含义 |
| - | 设定变量类型属性 |
| + | 取消变量类型属性 |
| -a | 声明为数组类型 |
| -i | 声明为整型 |
| -x | 声明为环境变量 |
| -r | 只读变量 |
| -p | 显示指定变量被声明的类型 |
系统环境变量常见操作及变量名
| 变量名 | 含义 | 常见操作 |
|---|---|---|
| $0 | 当前shell名称/脚本名称 | 2获取传入参数 |
| $# | 传入脚本参数数量 | if[$# -gt 1] |
| $* | 传入脚本所有参数 | if[$? -eq 0]; |
| $PS1 | 命令提示符 | expot PS1="\u@\h\w>" |
| $HOME | 用户主文件夹 | cd ~ |
| $PATH | 全局命令的搜索路径 | PATH=$PATH:[新增路径] |
配置文件加载时需要bash完整登录时称为login shell;远程登录时不需要登录bash时称为non-login bash,比如开启子进程、执行外部命令。
在修改配置文件后不会立即生效,需要重启终端或者执行source ~/.bashrc
| 类型 | 符号 | 作用 | 用法 |
|---|---|---|---|
| 算数运算符 | + - * / % | & | 常规运算 | |
| 逻辑运算符 | || && ! | ||
| 比较运算符 | == != < > | ||
| 引号 | 双引号"" | 部分引用,仅$ ` \保留作用 | foo="${a}123" |
| 单引号'' | 完全引用,原样输出 | foo='foo$a' | |
| 反引号`` | 执行命令 | foo=ls -a | |
| 圆括号 | (()) | 算术运算 | foo=$((1+2)) |
| () | 执行命令 | $(ls -a) | |
| 命令连接 | || | 命令1执行后返回码非零,则继续执行命令2 | cmd1 || cmd2 |
| && | 命令1执行后返回码非零,则继续执行命令2 | cmd1 && cmd2 | |
| ; | cmd1、cmd2 串行执行 | cmd1 ;cmd2 | |
| 后台运行 | & | 命令后台运行,可与nohup一起使用,使得终端关闭后命令继续执行 | cmd & |
管道:管道符|之前的命令执行完后执行|之后的命令
管道右侧命令必须接受标准输入,如grep,不能直接使用的命令可以用xargs作预处理比如find . -maxdepth 1 -name "*.sh" | xargs ls -l
管道命令仅处理stdout,忽略stderr使用set -o pipefail设置遇到管道错误退出。
简单说就是多个程序进行一个连接,进程通信方式之一。
重定向:
shell命令执行时会打开三个文件描述符0、1、2,对应标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),三个文件描述符默认指向终端输入和终端输出,重定向值指不去使用默认输入输出,我们自己重新指定输入输出的文件作标准设备。
输入重定向符号
- 标准输入:命令<文件1 命令将文件1的内容作标准输入设备
- 标识符限定输入:命令<<标识符 命令把当前输入内容继续使用,当遇见标识符停止,接收内容作新的标准输入。
输出重定向符号:
- 标准输出:命令>文件 覆盖并写入到指定文件;命令>>文件 追加并写入指定文件或设备;
- 标准错误输出:错误命令2>文件 覆盖并把命令的错误输出输出到指定文件;错误命令2>>追加并把命令的错误输出输出到指定文件。
- 正确输出错误输出同时保存进文件:命令&>文件 覆盖方式正确输出错误输出同时保存进同一文件。