一.什么是shell?
在linux内核与用户直接的解释器程序; 通常指/bin/bash; 相当于操作系统的“外壳”。
二.怎么使用shell? shell的使用方式?
1. 命令行 ==交互式; 逐条解释执行,效率低
2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。
三.怎么切换shell ?怎么使用某个特定shell?
1. 通过usermod , chsh 更改登录的shell
2. 手动执行目标shell程序
/bin/sh //多数unix默认使用的shell /bin/bash //多数Linux默认使用的shell
四.交互式硬件设备
标准输入: 从该设备接收用户输入的数据
标准输出: 通过该设备向用户输出数据
标准错误: 通过该设备报告执行中的出错信息
五.什么是shell脚本?
写好的执行语句,能够完成特定任务的文件
创建脚步的步骤? 脚本创建三步走
1.创建文本文件;
2.添加可执行的脚步语句
3.添加x 执行权限。
六.脚本构成? 规范的脚步构成?
1. #!//脚本声明(使用哪种解释器)
2. # //注释信息(步骤, 思路,用途,变量含义等)
3. 可执行语句
七.脚本怎么执行? 脚本执行有哪几种方式?
1. 作为命令 /命令字; 指定脚本文件的路径,前提是有x 权限
2. 作为“参数”; 不要求有 x 权限
sh 脚本路径
source 脚本文件路径
. 脚本文件路径
./脚本文件路径
八.shell脚本怎么调试?
1.直接观察执行中的输出,报错信息
2.通过 sh -x 开启调试模式
3.在可能出错地方设置 echo 断点
九.Shell变量
1.变量的设置和取消
定义赋值变量: 变量名=变量值;
注意事项:
1. 等号两边不要有空格
2. 若指定的变量名已存在,相当于为此变量重新赋值
3. 变量名由字母/数字/下划线组成,区分大小写;不能以数字开头
2.查看变量
应用变量值 : $变量名
查看变量值: echo $变量名, echo ${变量名} //变量名易混淆时,以{}界定; 未定义的变量取不到值
echo $var16.5, ${var1}6.5
取消变量
手动取消: unset 变量名。。如:
unset X
退出shell环境时,变量会自动失效。
十.Shell变量的分类?
1.储存类型:
整数型, 浮点型,双精度浮点型, 字符型
2.使用类型:
环境变量: 通常都是大写,有系统维护,只有个别变量,用户可以直接更改
预定义变量: 位置变量: bash内置,存储执行脚本时提供的参数
预定义变量: bash内置,可直接调用,但不能直接赋值或修改
自定义变量: 由用户自主设置,修改及使用
环境变量:
1. 配置文件: /etc/profile ; ~/.bash_profile
2. 相关操作;
env //列出所有的环境变量
set //列出所有变量
3. 常见的环境变量
PWD, PATH , USER, LOGNAME, UID , SHELL, HOME, PS1, PS2
预定义变量:
$0 //当前所在的进程名或 脚本名
$$ //当前进程的PID号
$? //命令执行后的返回状态, 0表示正常, 1或其他值表示异常。
$# //已加载的位置变量的个数
$* //所有位置变量的值
位置变量 :
$n 或${n} //n为序号,在执行脚本时提供的命令后参数。
``
扩展赋值操作
有哪三种定界符?它们的区别是什么?
1. 双引号 "" : 允许扩展,以 $ 引用其他变量
2. 单引号 '' : 禁用扩展, 即便$也视为普通字符
3. 反撇号 `` 相当于$() : 将命令的执行输出作为值;但是$()更方便嵌套使用。
十一.怎么读取标准输入值? read 可以从标准输入中 读取值
read 从键盘读入变量 并完成赋值
格式: read [-p "提示信息"] 变量名 //注意要有空格
-p可选, -t可指定超时秒数
十二.变量的作用范围? 变量的作用域
1.局部变量
新定义的变量默认只能在当前Shell环境中有效;无法在子Shell环境中使用。
2. 全局变量
在当前Shell及子Shell环境中均有效
怎么定义全局变量: 使用export 可将局部变量声明为全局变量
export 局部变量名[=变量名] //为局部变量添加全局属性
export -n 全局变量名.... //取消指定变量的全局属性
十三.数值运算:
整数运算:
+ - * / %
1. expr 运算工具
格式: expr 整数1 运算符 整数2; //注意运算符两侧要有空格
+ - \* / % //注意乘法要转义,避免被作为Shell通配符
2. 使用 $[] 或 $(()) 表达式
相比expr更方便简便实用:
1.乘法操作 * 无需转义,
2.运算符两侧可以无空格;
3. 应用变量可以省略 $符号;
3.变量怎么 自增 或自减?
使用 $[] 或者 let 命令
echo $[i+=2]
let i++; echo $i
小数的运算
注意: Bash内建机制仅支持整数值运算; expr ; $[] 算式替换不支持小数的运算。
bc //多数Linux 默认安装此工具
quit 退出 ; scale=n 指定小数位数;
bc 的使用; 结合管道向bc发送表达式; 多个表达式分号分隔
echo "scale=4; $A*56.789;5/3" | bc
小数值的比较
基本用法:
echo "数值1 比较符 数值2" | bc
如果表达式成立,则返回的计算结果为1, 否则返回0
常见比较操作 > >= < <= == !=
A=12.34; B=56.78
echo "$A<=$B" | bc
十四.条件测试
test 测试操作
格式: test 选项 参数
或 [ 选项 参数 ] ; //注意要有空格
十五.文件状态测试
[ 操作符 文件或目录 ]
十六.整数值比较
[ 整数值1 操作符 整数值2 ]
十七.字符串比较
[字符串1 操作符 字符串2]
十八.组合多个条件
逻辑分隔操作
用法:
命令1 操作符 命令2
[条件1] 操作符 [条件2]
&& 给定条件必须都成立,整个测试结果才为真
|| 只要其中一个条件成立,则整个测试结果为真
! 取反符号
十九.if 选择结构
单分支结构
if 条件测试
then 命令序列
fi
双分支结构
if 条件测试
then 命令序列1
else 命令序列2
fi
多分支结构
if 条件测试1
then 命令序列1
elif 条件测试2
then 命令序列2
else 命令序列n
fi
二十.循环结构
for循环
for 变量名 in 值列表
do
命令序列
done
条件式循环
while 条件测试
do
命令序列
done
until循环
当条件不成立时,循环执行语句序列
until 条件测试
do
命令序列
done
case 分支结构
case 变量值 in
模式1)
命令序列1 ;;
模式2)
命令序列2;;
.....
*)
默认命令序列
esac
二十一.函数及中断控制
如何定义函数?
function 函数名{
命令序列
}
函数名(){
命令序列
}
怎么调用函数?
函数名 值1 值2 .. ..
中断,退出及相关指令:
break ; 跳出当前所在的循环体,
continue ; 跳过循环体内余下的语句,重新判断条件以判断是否需要执行下一次循环
exit; 退出脚本,默认的返回值是 0
shift ; 用来迁移位置变量,每执行一次,结果如下:丢弃$1,原来的$2 变为$1.
二十二.shell数组
变量的类型
变量的值默认均为文本
强制声明类型
格式 : declare 选项 变量名
常见选项
-i //强制为整数
-a //定义为数组
-x //设置为全局变量
-r //设置为只读
定义/赋值数组
方法一, 整体赋值:
格式: 数组名=(值1 值2 .. .. 值n)
方法二,单个元素赋值
格式: 数组名[下标]=值 //下标从0开始
输出数组元素
${数组名[下标]} //获取单个数组元素
${数组名[@]} //获取所有数组元素
${#数组名[@]} //获取数组元素的个数
${数组名[@]:起始下标:元素个数} //获取连续的多个数组元素
${#数组名[下标]} //获取某个数组元素的长度
${数组名[下标]:起始下标:字符数} //截取数组元素值的一部分
二十三.expect 简介
可以在shell脚本中,为交互式过程自动输送预先准备的文本或指令,而无需人工干预;触发的依据是预期会出现的特征提示文本。
正则
egrep 过滤工具 //相当于grep -E
以行为单位,逐行进行处理; 默认只输出与表达式匹配的文本行
基本用法:
格式1 : egrep [选项] ‘正则表达式' 文件 .. ..
格式2: 前置命令 | egrep [选项] ‘正则表达式
常用的命令选项
-i //忽略字母大小写
-v //条件取反
-c //统计匹配的行数
-q //静默,无任何输出, 一般用于检测 //看$? 返回值 如果为0,说明有匹配,否则无匹配
-n //显示出匹配结果所在的行号
--color //标红显示匹配字串
基本元字符
二十四.sed工具
1.Stream EDitor 流式编辑器; 非交互,基于模式匹配过滤及修改文本; 逐行处理,并将结果输出到屏幕;
2.可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作。
格式
格式1 : 前置命令 | sed [选项] ‘编辑指令'
格式2: sed [选项] '编辑指令' 文件 .. ..
常见命令选项
-n //屏蔽默认输出(全部文本);按条件输出
-i //直接修改文件内容
-f //使用sed脚本
-e //可指定多个处理动作
-r //启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
{} //可组合多个命令,以分号分隔
定址符, 即[地址1[,地址2]] //用来指定处理的起,止行数;省略定址符时,默认逐行处理全部文本
基本的处理动作
常见的处理操作示例
二十五.使用 sed脚本
复杂操作可存为脚本,通过-f调用
格式: sed -f 操作脚本 文件 .. ..
sed文本块处理
应用场景?能做什么?
如何在文本内插入新行?
如何插入多行文本?
如何替换掉指定的整行文本?
处理多行文本
修改后的文本有多行时? 我想插入多行怎么做?
以换行符\n 分隔
或者 使用\ 强制换行
#sed -n '2cXX\nYY' m.txt
sed 高级应用
文件导入导出
注意: -r动作应结合-i选项才会存入,否则只能输出
sed '2r m.txt' reg.txt
sed -n '/^XX/w d.txt' reg.txt
sed 复制剪切
模式空间:
存放当前处理的行,将结果输出;若当前行不符合处理条件,则原样输出;处理完当前行再读入下一行来处理。
保持空间:
作用类似于 “剪贴板”; 默认存放一个空行(换行符\n)
基本动作
-H : 模式空间 --[追加]--> 保持空间 //复制
-h : 模式空间 --[覆盖] -->保持空间 //复制
-G : 保持空间--[追加]--> 模式空间 //粘贴
-g : 保存空间--[覆盖] -->模式空间 //粘贴
例子:
sed '1,3H;$G' reg.txt //把第1-3行复制到文件末尾
sed '1h;2,3H;$G' reg.txt //可避免出现空行
sed '1h;1d;$G' reg.txt //把第1行剪切到文件末尾
sed '1h;2H;1,2d;$G' reg.txt //把第1-2行剪切到文件末尾
sed 流程控制
! 取反操作; 根据定址条件取反
sed -n '/bash$/!p' /etc/passwd
n 读下一行 ; 产生隔行/跳行的效果
sed -n 'p;n' reg.txt //输出奇数行
sed -n 'n;p' reg.txt //输出偶数行
二十六.awk工具概述
awk编程语言/数据处理引擎
创造者: Aho, Weinberger, kernighan
基于模式匹配检查输入文本,逐行处理并输出;通常用在shell脚本中,获取指定数据;单独用时,可对文本数据做统计。
用法:
格式1 : 前置命令 | awk [选项] '[条件]{编辑指令}' //多条语句可以分号分隔; print 是最常用的指令
格式2: awk [选项] ' [条件]{编辑指令}' 文件.. .. //注意:awk条件和指令需要使用单引号
常用命令选项
-F : 指定分隔符,可省略(默认空格或Tab位)
-f : 调用awk脚本进行处理
-v : 调用外部Shell变量
awk内置变量
有特殊含义,可直接使用
awk '{print "第"FNR"行","有"NF"列"}' m.txt
awk '{print "Last:"$NF}' m.txt //输出每行最后一个字段
awk -F: '$1==ENVIRON["USER"]{print $3}' /etc/passwd //输出当前用户的UID信息
二十七.条件的表现形式?
正则表达式
数值/字符串比较
逻辑比较
运算符
正则表达式: /正则表达式/
~匹配 !~ 不匹配
awk -F: '/^ro/{print}' /etc/passwd //列出以ro开头的用户记录
awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd //列出第7个字段不以bash结尾的用户名,登录shell
数值比较
== 等于 != 不等于
> 大于 >= 大于或等于
< 小于 <= 小于或等于
awk 'NR==2{print}' reg.txt //输出第2行文本
awk '$2!="XX"{print}' reg.txt //输出第2列不是XX的行
awk 'NF>=2{print}' reg.txt //输出包含2个及以上字段的行
逻辑比较测试
&& 逻辑与 : 期望多个条件都成立
|| 逻辑或 : 只要有一个条件成立即满足要求
awk -F: '$3==1 || $3==7{print $1,$3}' /etc/passwd //列出UID为1或7的用户信息
运算符
+ - * / %
++ -- += -= *= /=
seq 200 | awk 'BEGIN{i=0}($0%3==0)&&($0%13==0){i++}END{print i}' //计算同时被3和13整除的整数个数
二十八.流程控制-分支结构
单分支: if(条件){编辑指令}
双分支: if(条件){编辑指令1}else{编辑指令2}
多分支: if(条件){编辑指令1}else if(条件){编辑指令2} .. .. else{编辑指令N}
awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd //统计UID小于或等于500的用户个数;统计UID大于500的用户个数。
二十九.流程控制- 循环结构
while循环
while(条件){编辑指令}
do while循环
do{编辑指令}while(条件)
#awk -F [:/] '{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd //统计/etc/passwd文件内“root”出现的次数
for循环
for(初值;条件;步长){编辑指令}
其他控制语句- 常用的中断,退出等awk指令
三十.数组的定义及使用
定义数组:
格式: 数组名[下标]=元素值
调用: 数组名[下标]
遍历数组:
用法: for(变量 in 数组名){print 数组名[变量]}
#awk -F: '!a[$7]++{print $7}' /etc/passwd
命令sort :
-n //按数字升序排列
-k //针对指定的字段进行排序
-r //反向排序
/var/access_log | sort -nr -k2