shell基础
一.shell脚本
在 /etc/shells 中可以找到当前系统支持的shell脚本种类
脚本用途
将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
减少手工命令的重复输入,一定程度上避免人为错误
将软件或应用的安装及配置实现标准化
用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
脚本构成
脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
注释信息:以#开头的语句表示为注释信息
可执行语句、命令:比如echo命令用于输出" "之间的字符串
脚本执行逻辑和方式
相对绝对路径
相对路径
绝对路径
指定解释器执行
脚本可能发生的错误
1.命令错误:默认后续的命令还会继续执行,用bash -x进行检查
2.语法错误:可以使用bash -n 检查错误,错误的行数不一定准确
3.逻辑错误:只能自己去筛查
二.重定向与管道符
1)重定向
类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出的数据
标准错误:通过该设备报告执行出错的信息
重定向的意思就是,不通过标准输出到屏幕上,输出到自己指定的位置
2)多行重定向
EOF
—————————————————————————————————————————————————————————————————————————————————
—————————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————
三.变量
1)常见shell变量类型
自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用
2)变量命名要求
区分大小写
不能使程序中的保留字和内置变量:如:if, for,hostname 命令
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
3)自定义变量
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=COMMAND
或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除
变量引用:
$name
${name}
弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
变量追加值
格式 变量名+=追加值
1.赋值时使用双引号(" ")可以直接调用变量
2.赋值时使用单引号(' ')只会被认为是字符 不会调用变量
3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同
4.{}可以分隔变量值
read -p
从键盘输入的内容变成变量
整数运算
expr和let只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
随机数生成
1-100随机数
提取系统信息
环境变量
由系统提前创建,用来设置用户的工作环境
可以使用env查看环境变量
需要记住的常用环境变量
:
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
环境变量的全局配置文件:
/etc/profile如果修改此文件会作用于所有用户
~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户 可以用来长期变更或设置环境变量
位置变量
求和
预定义(状态)变量
系统已经设置好了,直接可以拿来使用,不需要知道为什么,自己死记硬背
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#:表示命令行中位置参数的总个数
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
'$$':当前进程id
$!: 后台任务最后一个id
$*是将整个参数名看做一个整体
$@是把每一个参数看成一个整体
4.条件语句
1)测试
test测试文件的表达式是否成立
格式1:test 条件表达式
格式2:[ 注意两边需要空格 ]
格式3:[ 操作符 文件或者目录]
操作符:
2)比较整数数值
格式:[ 整数1 操作符 整数2 ] 公式
-eq:第一个数等于(Equal)第二个数
3)字符串比较
常见的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在
格式:
[ 字符串1 = 字符串2 ] 是否相同
[ 字符串1 != 字符串2 ] 是否不相同
[ -z 字符串 ] 是否为空
[ -n 字符串 ] 字符是否存在
4)逻辑测试
格式1:【表达式1】操作符【表达式2】...
格式2:命令1 操作符 命令2 ...
常见条件
-a或&&:逻辑与,“而且”的意思全真才为真
-o或||:逻辑或,“或者”的意思一真即为真
!:逻辑否
两个命令都为真时
5)双中括号
(){ }
6)if 语句结构
单分支结构
if 判断条件
then 条件为真的分支代码
fi
双分支
if 判断条件
then 条件为真的分支代码
else 条件为假的分支代码
fi
多分支
if 判断条件1
then 条件1
为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3
条件3为真的分支代码
then
...
else
以上条件都为假的分支代码
fi
7)case 结构
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*) //其他,必须要有的格式 默认分支
;;
esac
8)echo
echo命令
echo -n:表示不换行输出
echo -e:表示输出转义符
常用转义符
选项 作用
\r 光标移至行首,并且不换行
\s 当前shell的名称,如bash
\t 插入Tab键,制表符
\n 输出换行
\f 换行,但光标仍停留在原处
\ 表示插入""本身转义
\b 表示退格 不显示前一个字符
\c 抑制更多的输出或不换行
4.正则表达式过滤文本
1)元字符
元字符(字符匹配): . :匹配任意单个字符,可以是一个汉字
[ ] :匹配指定范围内的任意单个字符,例如[zhou]: zhou中其中一个字符,[0-9] :数字0-9之间任意一个字符
[^ ] :匹配指定范围外的任意单个字符,例如[^zhou]:除了zhou这几个字符以外的单个别的字符,[^a.z]:除了a和z之间还有一个字符不匹配外,匹配其他字符
常用的正则表达式:
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符
2)表示次数
3)位置锚定
4)分组或其他
分组:
() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
或者 : \|
5)扩展正则表达式
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0
表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...
| 或者 a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
6)grep
格式:grep [选项]... 查找条件 目标文件
选项:
6.AWK
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自
由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
有多种版本:
AWK:原先来源于 AT & T 实验室的的AWK
NAWK:New awk,AT & T 实验室的AWK的升级版
1)awk流程
2)基础用法
print动作
再打印一遍
输出都是hello
先输出hello 然后再输出第二行
提取df中的第五行
打印指定文件内容
3)awk常见的内置变量
FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:"
OFS:输出时的分隔符
NF:当前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0:当前处理的行的整行内容
$n:当前处理行的第n个字段(第n列)
$NF:显示最后一个字段
FILENAME:被处理的文件名
RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
4)模式
格式: awk '模式{处理动作}'
不支持使用行号,但是可以使用变量NR 间接指定行号
/pat1/ 匹配pat1 的行
/pat1/,/pat2/ 正则表达式1 到 正则表达式2 之间的行 如果匹配不到2的表达式 会匹配到文末
与:&&,并且关系
或:||,或者关系
非:!,取反
5)条件判断
if语句:awk的if语句也分为单分支、双分支和多分支
单分支为if(){}
双分支为if(){}else{}
多分支为if(){}else if(){}else{}
6)for
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
5050
#相当于在awk里面直接做出100个数相加