在linux内核与用户直接的解释器程序; 通常指/bin/bash; 相当于操作系统的“外壳”。
1. 命令行 ==交互式; 逐条解释执行,效率低
2. 脚本 == 非交互式; 批量执行,效率高; 方便在后台静悄悄地运行。
1. 通过usermod , chsh 更改登录的shell
2. 手动执行目标shell程序
/bin/sh //多数unix默认使用的shell /bin/bash //多数Linux默认使用的shell
标准输入: 从该设备接收用户输入的数据
标准输出: 通过该设备向用户输出数据
标准错误: 通过该设备报告执行中的出错信息
写好的执行语句,能够完成特定任务的文件
创建脚步的步骤? 脚本创建三步走
1.创建文本文件;
2.添加可执行的脚步语句
3.添加x 执行权限。
1. #!//脚本声明(使用哪种解释器)
2. # //注释信息(步骤, 思路,用途,变量含义等)
3. 可执行语句
1. 作为命令 /命令字; 指定脚本文件的路径,前提是有x 权限
2. 作为“参数”; 不要求有 x 权限
sh 脚本路径
source 脚本文件路径
. 脚本文件路径
./脚本文件路径
1.直接观察执行中的输出,报错信息
2.通过 sh -x 开启调试模式
3.在可能出错地方设置 echo 断点
定义赋值变量: 变量名=变量值;
1. 等号两边不要有空格
2. 若指定的变量名已存在,相当于为此变量重新赋值
3. 变量名由字母/数字/下划线组成,区分大小写;不能以数字开头
应用变量值 : $变量名
查看变量值: echo $变量名, echo ${变量名} //变量名易混淆时,以{}界定; 未定义的变量取不到值
echo $var16.5, ${var1}6.5
手动取消: unset 变量名。。如:
unset X
退出shell环境时,变量会自动失效。
整数型, 浮点型,双精度浮点型, 字符型
环境变量: 通常都是大写,有系统维护,只有个别变量,用户可以直接更改
预定义变量: 位置变量: 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 [-p "提示信息"] 变量名 //注意要有空格
-p可选, -t可指定超时秒数
1.局部变量
新定义的变量默认只能在当前Shell环境中有效;无法在子Shell环境中使用。
2. 全局变量
在当前Shell及子Shell环境中均有效
怎么定义全局变量: 使用export 可将局部变量声明为全局变量
export 局部变量名[=变量名] //为局部变量添加全局属性
export -n 全局变量名.... //取消指定变量的全局属性
格式: expr 整数1 运算符 整数2; //注意运算符两侧要有空格
+ - \* / % //注意乘法要转义,避免被作为Shell通配符
相比expr更方便简便实用:
1.乘法操作 * 无需转义,
2.运算符两侧可以无空格;
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 条件测试
then 命令序列
fi
if 条件测试
then 命令序列1
else 命令序列2
fi
if 条件测试1
then 命令序列1
elif 条件测试2
then 命令序列2
else 命令序列n
fi
for 变量名 in 值列表
do
命令序列
done
while 条件测试
do
命令序列
done
当条件不成立时,循环执行语句序列
until 条件测试
do
命令序列
done
case 变量值 in
模式1)
命令序列1 ;;
模式2)
命令序列2;;
.....
*)
默认命令序列
esac
function 函数名{
命令序列
}
函数名(){
命令序列
}
函数名 值1 值2 .. ..
break ; 跳出当前所在的循环体,
continue ; 跳过循环体内余下的语句,重新判断条件以判断是否需要执行下一次循环
exit; 退出脚本,默认的返回值是 0
shift ; 用来迁移位置变量,每执行一次,结果如下:丢弃$1,原来的$2 变为$1.
变量的值默认均为文本
强制声明类型
格式 : declare 选项 变量名
-i //强制为整数
-a //定义为数组
-x //设置为全局变量
-r //设置为只读
方法一, 整体赋值:
格式: 数组名=(值1 值2 .. .. 值n)
方法二,单个元素赋值
格式: 数组名[下标]=值 //下标从0开始
${数组名[下标]} //获取单个数组元素
${数组名[@]} //获取所有数组元素
${#数组名[@]} //获取数组元素的个数
${数组名[@]:起始下标:元素个数} //获取连续的多个数组元素
${#数组名[下标]} //获取某个数组元素的长度
${数组名[下标]:起始下标:字符数} //截取数组元素值的一部分
可以在shell脚本中,为交互式过程自动输送预先准备的文本或指令,而无需人工干预;触发的依据是预期会出现的特征提示文本。
egrep 过滤工具 //相当于grep -E
以行为单位,逐行进行处理; 默认只输出与表达式匹配的文本行
格式1 : egrep [选项] ‘正则表达式' 文件 .. ..
格式2: 前置命令 | egrep [选项] ‘正则表达式
-i //忽略字母大小写
-v //条件取反
-c //统计匹配的行数
-q //静默,无任何输出, 一般用于检测 //看$? 返回值 如果为0,说明有匹配,否则无匹配
-n //显示出匹配结果所在的行号
--color //标红显示匹配字串
1.Stream EDitor 流式编辑器; 非交互,基于模式匹配过滤及修改文本; 逐行处理,并将结果输出到屏幕;
2.可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作。
格式1 : 前置命令 | sed [选项] ‘编辑指令'
格式2: sed [选项] '编辑指令' 文件 .. ..
-n //屏蔽默认输出(全部文本);按条件输出
-i //直接修改文件内容
-f //使用sed脚本
-e //可指定多个处理动作
-r //启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
{} //可组合多个命令,以分号分隔
定址符, 即[地址1[,地址2]] //用来指定处理的起,止行数;省略定址符时,默认逐行处理全部文本
复杂操作可存为脚本,通过-f调用
格式: sed -f 操作脚本 文件 .. ..
应用场景?能做什么?
如何在文本内插入新行?
如何插入多行文本?
如何替换掉指定的整行文本?
修改后的文本有多行时? 我想插入多行怎么做?
以换行符\n 分隔
或者 使用\ 强制换行
#sed -n '2cXX\nYY' m.txt
sed 高级应用
文件导入导出
注意: -r动作应结合-i选项才会存入,否则只能输出
sed '2r m.txt' reg.txt
sed -n '/^XX/w d.txt' reg.txt
存放当前处理的行,将结果输出;若当前行不符合处理条件,则原样输出;处理完当前行再读入下一行来处理。
作用类似于 “剪贴板”; 默认存放一个空行(换行符\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 -n '/bash$/!p' /etc/passwd
n 读下一行 ; 产生隔行/跳行的效果
sed -n 'p;n' reg.txt //输出奇数行
sed -n 'n;p' reg.txt //输出偶数行
awk编程语言/数据处理引擎
创造者: Aho, Weinberger, kernighan
基于模式匹配检查输入文本,逐行处理并输出;通常用在shell脚本中,获取指定数据;单独用时,可对文本数据做统计。
格式1 : 前置命令 | awk [选项] '[条件]{编辑指令}' //多条语句可以分号分隔; print 是最常用的指令
格式2: awk [选项] ' [条件]{编辑指令}' 文件.. .. //注意:awk条件和指令需要使用单引号
-F : 指定分隔符,可省略(默认空格或Tab位)
-f : 调用awk脚本进行处理
-v : 调用外部Shell变量
有特殊含义,可直接使用
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(条件){编辑指令}
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(初值;条件;步长){编辑指令}
其他控制语句- 常用的中断,退出等awk指令
格式: 数组名[下标]=元素值
调用: 数组名[下标]
用法: for(变量 in 数组名){print 数组名[变量]}
#awk -F: '!a[$7]++{print $7}' /etc/passwd
-n //按数字升序排列
-k //针对指定的字段进行排序
-r //反向排序
/var/access_log | sort -nr -k2
评论专区