[TOC]
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序,业界所说的 shell 通常都是指 shell 脚本。
基本语法
变量
shell中的变量是弱类型的,允许对变量进行算数运算和比较,决定因素是变量值是否含有数字
|
|
单引号双引号
|
|
字符串
|
|
数组
声明定义
|
|
数组处理
|
|
字符串分割为数组
|
|
遍历
|
|
示例
|
|
函数
定义及使用
|
|
条件判断
条件判断test
与[]
效果等价
|
|
|
|
比较运算
文件比较运算符
|
|
字符串比较运算符
|
|
算数比较运算符
|
|
ne、eq等使用于数字,==/=适用于字符串比较
ps: ==/=在[]中效果相同,在[[]]中效果不同
逻辑运算符
|
|
环境相关
环境变量
变量可以划分为局部变量
和环境变量
,其中局部变量只在当前shell进程中有效,环境变量在所有子进程中也有效,简单来说环境变量可以传递给子孙进程
默认变量都是局部变量,通过export
使其变为环境变量
|
|
source
: 在当前环境下运行并执行file中的命令,别名.
。常用于合并配置信息,类似php中的include
,比如向环境变量中添加内容
|
|
特殊变量
|
|
历史命令
|
|
输入输出
获取命令参数
- 利用参数变量
- 利用for循环
for循环获取参数变量
当for循环没有指定列表时,默认读取位置参数列表。
Nginx就是利用这种方式获取configure参数的
|
|
格式化输出
|
|
输出多行文本
|
|
输出多行文本至文件
|
|
命令行输入
|
|
重定向
每个Linux命令运行时都会打开三个文件:
- 标准输入文件(stdin): 文件描述符为0,Linux程序默认从stdin读取数据
- 标准输出文件(stdout): 文件描述符为1,Linux程序默认向stdout输出数据
- 标准错误文件(stderr): 文件描述符为2,Linux程序默认向stderr写入错误信息
|
|
subshell
在bash 脚本中,subshells (写在圆括号里的) 是一个很方便的方式来组合一些命令。一个常用的例子是临时地到另一个目录中,例如:
|
|
<(some command)
通过 <(some command) 可以把某命令当成一个文件。
示例:比较一个本地文件和远程文件 /etc/hosts:
|
|
数据处理
集合交集、并集、差集
|
|
awk和sed
awk分4段 选择段|起始段|处理段|结束段
filter BEGIN{} {} END{}
例如求第三列数字之和
awk '{x+=$3} END {print x}'
NR 行号
指定多个分隔符 awk -F [;|]
|
|
awk中变量类型转换
|
|
为什么02没有被过滤掉?是因为$1发生了隐式转换变为了2。
那么如何才能精确的取出值为2的行的呢?我们需要对比较运算符右侧的2
做显示类型转换
|
|
2""
将数字2转换为字符串”2”,此时$1与之对比时也会转换为字符串,逐字进行比较
字符串转数字 strtonum($str) 或 $str+0
数字转字符串 $num””
时间戳转换
|
|
文件分割
|
|
文件系统
查找文件
|
|
过滤文件grep/pgrep
|
|
其他
路径相关
|
|
日期时间
|
|
ssh
|
|
压缩
|
|
other
|
|
FAQ
1.为什么关闭会话后,正在执行的命令也会被关闭
原因: 关闭会话操作会将当前会话相关的进程全部关闭
衍生:为什么用php的exec方法执行的命令 在页面关闭后还会继续执行?
因为命令是使用web服务器的启动用户来进行的,并不涉及会话关闭,所以进程依旧存在,命令依旧执行
参考:
解决Linux关闭终端(关闭SSH等)后运行的程序自动停止
Linux—进程组、会话、守护进程
linux 关闭远程回话之后保持进程继续
2.删除当前目录下文件名不等于a的所有文件
|
|