# 文本与文本查找
## 1.grep
常用参数:
-A n --after-context显示匹配字符后n行
-B n --before-context显示匹配字符前n行
-C n --context 显示匹配字符前后n行
-c --count 计算符合样式的行数
-i 忽略大小写
-v反转
-a处理二进制文件
-l 只列出文件内容符合指定的样式的文件名称
-f 从文件中读取关键词
-n 显示匹配内容的所在文件中行数
-R 递归查找文件夹
常用组合:grep -Rni “abc”
实例:
(1)查找指定进程
ps -ef | grep svn
(2)查找指定进程个数
ps -ef | grep svn -c
(3)从文件夹中递归查找以grep开头的行,并只列出文件
grep -lR '^grep' /tmp
(4)查找非x的行内容
grep ‘[^x]' test.txt
(6)显示包含ed或者at字符的内容行
grep -E 'ed|at' test.txt
##2.find
命令选项:
-name 按照文件名查找文件 “*123*” 通配符要加引号
-iname忽略大小写
-perm 按文件权限查找文件
-user 按文件属主查找文件
-group 按照文件所属的组来查找文件。
-type 查找某一类型的文件,诸如:
d - 目录 f - 普通文件
-size n :[c] 查找文件长度为n块文件,带有c时表文件字节大小 +代表大于 -代表小于
-mmin n 查找系统中最后N分钟被改变文件数据的文件 n:正数代表外,负数代表内
-mtime n 查找系统中最后n*24小时被改变文件数据的文件 n:天数
常组合用 最常用命令:find /home/test(路径) -type f -mtime +10 -exec rm -rf {} \;
举例:
(1)查找48小时内修改过的文件 find -mtime -2
(2)在当前目录查找 以.log结尾的文件。 ". "代表当前目录 find ./ -name '\*.log'
(3)查找/opt目录下 权限为 777的文件 find /opt -perm 777
(4)查找大于210M的文件 find ./ -size +210M
find -size 1000c 查找等于1000字符的文件
(5)在当前目录中查找更改时间在10日以前的文件并删除它们(无提醒) find . -type f -mtime +10 -exec rm -rf {} \;
(6)当前目录更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除 文中查找所有文件名以.log结尾、件, 按n键不删除 find . -name '\*.log' -mtime +5 -ok rm {} \;
(7)用exec选项执行cp命令
find . -name '\*.log' -exec cp {} test3 \;
(8)查找当前目录中以一个小写字母开头,最后是4到9加上.log结束的文件
find . -name '[a-z]\*[4-9].log' -print find用的是:通配符\*
# 软件安装与更新
##1. rpm安装
rpm -ivh package.rpm 安装一个rpm包
rpm -Uvh package.rpm 更新一个rpm包但不改变其配置文件
rpm -qa | grep 显示系统中所有已经安装的rpm包
rpm -e package_name 删除一个rpm包
源代码编译安装
./configure
make
make install
##2. yum源安装
yum install package_name 下载并安装一个rpm包 常用
yum update package_name 更新一个rpm包
yum remove package_name 删除一个rpm包
yum list 列出当前系统中安装的所有包
yum search package_name 在rpm仓库中搜寻软件包
yum clean all 删除所有缓存的包和头文件
# 网络配置
## 1.网络配置命令
ifconfig查看和配置网络接口
ip查看和配置网络接口、路由
netstat查看进程监听端口状态
network与networkmanager网络管理脚本
##2.配置文件
ifcfg-eth0 eth0 网卡配置文件
networking主机名配置文件
resolv.conf域名配置文件
#防火墙
##1. Selinux
常用命令
getenforce 状态的查看
Setenforce 0|1 #0表示警告模式1表示强制模式
配置文件
/etc/selinux/config
## 2.iptables
# Tcpdump
-i 指定网卡
-c指定抓包数量
-n不把网络地址转化成名字
-nn不进行duankou名称的转化
-w直接将分组写进文件中,而不是不分析并打印出来
-e在输出行打印出数据链路的头部信息
-vv输出详细的报文信息
host主机
port端口
#服务与日志
服务状态的查看命令
sevice 用法:sevice 服务名称 start/stop/restart/status
systemctl 用法:systemctl start/stop/restart/status 服务名称
常用服务日志
/var/log 系统日志默认目录
message系统日志
dmesg内核启动日志
secure安全日志
#磁盘分区
## 1.链接文件
符号链接
硬链接
##2. Mount挂载命令
-t文件系统类型
-o挂载选项 (ro只读挂载,rw读写挂载,remount重挂载)
配置文件
/etc/fstab
## 3.常用命令
Fdisk分区工具(-l查看分区信息、fdisk /dev/sdx为某一个存储分区)
df查看分区使用的空间大小 df -h
du查看文件夹使用空间大小 du -sh
mkfs格式化命令(mkfs.ext4 mkfs.xfs)
#系统启动过程与故障修复
##1.系统启动过程描述
Bios初始化,开始post开机自检,检查硬件
加载MBR到内存,加载磁盘主引导记录到内存
GRUB阶段
加载内核
systemd阶段
service服务或systemctl服务
启动,等待用户登录
#逻辑卷与lvm
Lvm分为三层:PV物理卷,VG卷组,LV逻辑卷
## 常用命令:
Pvcreate 建立pv pvs查看pv
Vgcreate建立vg vgs查看vg
Lvcreate建立lv lvs查看lv
Lvextend扩展lv
# grep 搜索字符串匹配的行 搜索要匹配的字符串的行和文件
强大的文本搜索命令,grep(Global Regular Expression Print)全局正则表达式搜索
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板,如果模板包括空格,则必须被引用。
模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。
### 命令格式:
grep [option] pattern file|dir grep -参数 [正则表达式] 文件或路径 “要搜索的字符串”
常用参数:
-A n --after-context显示匹配字符后n行
-B n --before-context显示匹配字符前n行
-C n --context 显示匹配字符前后n行
-c --count 计算符合样式的行数
-i 忽略大小写
-l 只列出文件内容符合指定的样式的文件名称
-f 从文件中读取关键词
-n 显示匹配内容的所在文件中行数
-R 递归查找文件夹
常用组合:grep -Rni “abc”
### grep的规则表达式:
^ #锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* #一起用代表任意字符。相当于通配符的* 任意多个任意字符
[] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
--- begin 使用场景较少 供参考 ---
\< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} #重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b #单词锁定符,如: '\bgrep\b'只匹配grep。
--- end 使用场景较少 供参考 ---
### grep 实例:
(1)查找指定进程
ps -ef | grep svn
(2)查找指定进程个数
ps -ef | grep svn -c
(3)从文件夹中递归查找以grep开头的行,并只列出文件
grep -lR '^grep' /tmp
(4)查找非x的行内容
grep ‘[^x]' test.txt
(6)显示包含ed或者at字符的内容行
grep -E 'ed|at' test.txt
# sed stream editor 用的正则表达式 对文件内容进行增删改查
sed [选项] [命令] 文件名
sed的常用选项:
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n: 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
a:追加 向匹配行后面插入内容 都会用到一个编辑命令
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配内容的行
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项合用
=:用来打印被匹配的行的行号
r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
### sed 举例
1 sed -i "/The start script/iabc" 1.txt #增 在包含 The start script行之前进行添加行 abc
2 sed -i "/The start script/aabc" 1.txt #增 在包含 The start script行之后进行添加行 abc
3 sed -i ‘s/指定的字符/要插入的字符&/’1.txt #增 在指定的字符之前插入字符 默认只匹配第一个 如果要匹配所有的&/g
4 sed -i 's/指定的字符/&要插入的字符/’ 1.txt #增 在指定的字符之后插入字符
sed -i 's/cp \$HIVE_HOME/\\&/' /opt/cloudera/parcels/CDH/lib/hive/bin/hive-config.sh
5 sed -i ‘s/^.\*23/#&/g’ 1.txt #增 注释掉某一行
6 sed -i '/ac/d' 1.txt #删 删除包含ac的行
7 sed '4d' 1.txt #删 删除第四行
8 sed -i "s/ac/bd/g" 1.txt #改 老字符替换成新字符
9 sed -i '/ac/c hello ' start_es.sh sed "/11/c999" 1.txt #改 替换包含ac的一行的内容
10 sed '3ahello' 1.txt #向第三行后面添加hello,3表示行号
11 sed '3ihello' 1.txt #在第三行之前插入hello
12 sed -n '3p' 1.txt #打印文件中的第三行内容
13 sed -n '1,3p' 1.txt #打印1到3行
14 sed '/^$/d' 1.txt #删除空行
15 sed -i '/bbb/r 2.txt' 1.txt # 读取2.txt文件,将文件内容写入到1.txt中匹配bbb的行之后。
16 sed -i 'r 2.txt' 1.txt # 读取2.txt文件,将文件内容写入到1.txt每一行之后。
17 sed ‘/789/w a.txt’ 1.txt #如果1.txt包含789的行,将包含789的行覆盖写入到a.txt中,如果不包含,清空a.txt
18 sed ‘w a.txt' 1.txt #将文件1.txt的内容写入到a.txt
19 sed -i -e '1,3d' -e '/abc/cABC' 1.txt #-e的用法举例,先删除1到3行,然后将匹配abc的行替换为ABC。
20 sed -n -e '/a/p' -e '/a/=' 1.txt #先打印文件匹配行的内容,再打印文件匹配航的行号。
21 sed -n ‘/abc/=' 1.txt #打印匹配行的行号
# sort 排序 sort
默认按ASCII码值进行比较,最后将他们按升序输出
示例1
sort 1.txt # 排序
示例2
sort -u 1.txt # 排序并去重 常用
示例3
sort -r 1.txt # 降序进行排序
示例4 慎重
[rocrocket@rocrocket ~]$ sort -r number.txt > number.txt
[rocrocket@rocrocket ~]$ cat number.txt
[rocrocket@rocrocket ~]$
// 看,竟然将number清空了
这个时候 -o就出现了,
sort -r 1.txt -o 1.txt # -o(output) 输出到原文件
示例5
10比2小的情况。
要使用-n选项,来告诉sort,“要以数值来排序”! 常用
sort -n(number) number.txt
示例六
这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量, 第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实 现?幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut的-d选项)
指定了间隔符之后,就可以用-k来指定列数了。
sort -n -k 2 -t : facebook.txt
# -t 分隔符为:,-k 以第二列进行排序,-n 按照数值进行排序
示例七
-f 会将小写字母都转换为大写字母来进行比较,亦即忽略大小写
-b 会忽略每一行前面的所有空白部分,从第一个可见字符开始比较
示例八
我想让facebook.txt按照公司人数排序 ,人数相同的按照员工平均工资升序排序
sort -n -t ' ' -k 2 -k 3 facebook.txt
看,我们加了一个-k2 -k3就解决了问题。sort支持这种设定,就是说设定域排序的优先级,先以第2个域进行排序,如果相同,再以第3个域进行排序。
(如果你愿意,可以一直这么写下去,设定很多个排序优先级)
# uniq 去重
用法:uniq [选项]... [文件]
从输入文件或者标准输入中筛选相邻的匹配行并写入到输出文件或标准输出。
参数:
-c, --count 在每行记录前显示该行内容的数量
-d, --repeated 仅显示重复的记录行,并且去重
-D, --all-repeated[=delimit-method] 仅显示重复的行,并不去重
-i, --ignore-case 忽略大小写 以最先的字符为准
-s, --skip-chars=N 比较时跳过前N个字符
-u, --unique 仅显示非重复的行
-w, --check-chars=N 只对比指定的N个字符,默认是从开始算起,如果和-s一起使用那么要排除-s指定的字符数
### 举例
uniq -c 1.txt # 1.显示行的数量
uniq -d 1.txt # 2.只显示重复的行,并去重
uniq -u 1.txt # 3.仅显示非重复的行
uniq -s 2 -w 2 1.txt # 4.-s和-w
-s 2:忽略前两个字符,即从第三列开始比较
-w 2:只比较两个字符,即只比较第三列开始的两个字符
### 《 sort+uniq 》
• uniq 去除重复的行,最终结果包含重复和非重复的行。
• uniq -u 只打印非重复的行。
• uniq -d 只打印重复的行。
#### 两个文件的交集 --- 重复的行 先排序再去重 p排序之前先去重
sort out1.txt out2.txt | uniq -d
\# -d 输出重复的行, 需要注意一个问题,那就是这两个文件,在各自的文件中不要出现重复的数据(要先对各个文件进行排序去重)
两个文件的并集 --- 去重之后的行,包括重复的已被去重的行和不重复的行
sort out1.txt out2.txt | uniq # uniq不加参数意思是去掉重复的数据
#### 两个文件的差集
out1.txt-out2.txt
sort out1.txt out2.txt out2.txt | uniq -u
讲解:sort out1.txt out2.txt out2.txt 会让out2.txt的所有内容都出现两次,所以uniq -u 之后不会出现 out2.txt 里面的内容;而out1.txt和out2.txt重复的内容会至少出现3次以上,也不会输出到结果中.
所以最终结果一定是out1.txt在out2.txt中没有出现过的数据,也就是out1.txt-out2.txt的差集
### 《 sort+uniq 》
out2.txt - out1.txt
sort out1.txt out1.txt out2.txt | uniq -u
原理请看上面的out1.txt-out2.txt的讲解,原理是一样的
#### [提醒]
去除文件重复的行
在shell中可以利用uniq
sort unsorted.txt | uniq
注意:要先进行排序,才能调用uniq (uniq命令,只是把相邻的重复的数据行去掉)
#### paste 粘贴
paste [ -d -s ] -file1 file2
选项含义如下:
-d 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用-d @。
-s 将每个文件合并成行
# awk 具有强大的文本格式化能力 一个强大的文本分析工具
awk [options] 'pattern{action}' file
command | awk ' condition { action }'
示例1 全部打印
awk '{print}' 1.txt
示例2 添加前缀和后缀
awk 'BEGIN{print "col1","col2"} {print} END{print "end1","end2"}' a.txt
示例3 -F 指定分隔符 常用
awk -F "+" '{print $2}' a.txt 必须单引号
示例4
NF(当前行的字段个数) $NF就代表最后一个字段,$(NF-1)代表倒数第二个字段
echo "aa bb cc dd" | awk '{print $NF}'
echo "aa bb cc dd" | awk '{print $(NF-1)}'
示例5 不打印某一列时,将对应列设置为空字符串即可,用 $NF="",设置多列时用分号分隔开
cat aa.txt | awk '{$NF="";print $0}’ #不打印最后一列
cat aa.txt | awk '{$(NF-1)="";$NF="";print $0}' #不打印最后两列
示例6 NR (当前处理的是第几行) row 行 Colum 列
cat test.txt | awk '{print NR")", $0}' #打印当前行号和当前文本内容 $0 打印所有
逗号表示输出的变量之间用空格分隔
右括号必需使用 双引号 才可以原样输出
示例7 打印指定行内容
java -version 2>&1 | awk 'NR==1 {print $0}' #打印第一行
cat a.txt | awk ‘NR==3 {print $0}'
示例8 awk 允许指定输出条件,只输出符合条件的行
awk '条件 {动作}' 文件名
特殊字符需要转义
cat exp.txt | awk '/stsvc\/fms/ {print $0}' #包含 stsvc/fms 的行
cat exp.txt | awk 'NR>4 {print $0}' #大于第四行
cat test.txt | awk '$2=="ff" {print $0}' #某个字段等于具体值
echo "aa ss dd" | awk '{ if($3 == "dd") print $0; else print "nothing"}' # if条件
## 1.使用终端:
命令提示符:$普通用户 #root用户
命令和路径补全:tab键
命令的分类(使用type查看某个命令的所属分类):内部命令和外部命令
## 2.帮助命令和用法:有问题找man
man:man xxx 获取xxx命令的帮助
man 1 man:查看man命令自身的帮助文档
help xxx:获取内部命令的帮助
xxx—help:获取外部命令的帮助
info:比man更丰富的帮助信息,格式:info xxx
# 文件与目录管理
## 1.ls文件与目录查看命令
-l 显示文件的详细信息
-a显示隐藏文件
-r逆序显示
-t按时间排序
-R递归显示
## 2.路径操作(分绝对路径和相对路径)路径操作(分绝对路径和相对路径)
cd进入指定路径
pwd显示当前路径
## 3.建立与删除目录
mkdir新建目录
rmkdir删除空目录
## 4.通配符
*匹配任意字符
?匹配单个字符
[xyz]匹配xyz任意一个字符
[!xyz]或[^xyz]匹配不在xyz中的任意字符
##5.复制文件cp
-r复制目录
-p保留用户权限时间
-a尽可能保留原始文件的属性,等同于-dpR
##6.删除文件rm
-r递归删除
-f不提示
## 7.移动与重命名
移动文件 mv file1 dir1/
重命名文件 mv file1 file2
##8.文本查看
head显示文本前n行
tail显示结尾n行
cat file 查看文件
cat –f显示文件更新消息
##9.打包和压缩
a.tar 打包命令
tar -czvf test.tar.gz a.c //压缩a.c文件为test.tar.gz
tar –xzvf test.tar.gz //解压文件
b.gzip 123.txt gunzip 123.txt.gz gzip -d 123.txt.gz
-r 压缩目录
-c 保留原文件 进行压缩 gzip -c 123.txt > 123.txt.gz
-数字 用于指定压缩等级,-1 压缩等级最低,压缩比最差;-9 压缩比最高。
默认压缩比是 -6
c.zip file1.zip file1 创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip 解压一个zip格式压缩包 (这个也要记)
d.rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包,需要单独安装
rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1'
rar x file1.rar 解压rar包
unrar x file1.rar 解压rar包
# Vim文本编辑器
##1.正常模式
iIoOaA进入插入模式
i在当前光标位置进入插入模式
I移动到当前光标所在行首,进入到插入模式
a在当前光标位置之后进入插入模式
A移动到当前光标所在行尾,进入到插入模式
o在当前光标下一行进入插入模式
O在当前光标上一行进入插入模式
V(字符可视化) V(行可视化) ctrl+v(块可视化) 进入可视模式
:进入命令模式
Esc 回到正常模式
hjkl上下左右
yy y$复制
Ctrl+r重做命令
dd d$剪切
p粘贴
u撤销
X删除单个字符
r替换单个字符
G定位指定的行
^$定位到行的开头和结尾
##2.命令模式
w写入文件
w文件名 另存文件
q推出
q!不保存退出
wq!保存退出
!cmd执行命令
/查找命令
s/old/new替换命令
set nu设置行号
# 用户管理
groupadd group_name 创建一个新用户组 vi /etc/group
groupdel group_name 删除一个用户组
groupmod -n new_group_name old_group_name 重命名一个用户组
useradd -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户
useradd user1 创建一个新用户 vi /etc/passwd
userdel -r user1 删除一个用户 ( '-r' 排除主目录)
usermod -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性
passwd 修改口令 passwd user1 修改一个用户的口令 (只允许root执行)
/etc/passwd用户信息配置文件
/etc/shadow用户密码信息配置文件
su – hive 切换用户,带上- 也切换了环境变量
sudo -i 切换到超级用户 vi /etc/sudoers 添加 hadoop ALL=(ALL) NOPASSWD:NOPASSWD:ALL
who/w 查看登录的用户信息
# 权限管理
chmod 改变文件或目录权限
-R 递归修改 u/g/o/a +-= r/w/x 777
chown -R 改变文件或目录所有者 用户:用户组
chgrp -R 改变文件或目录所有组
备注:-c 回显修改前后信息
• Shell 是命令解释器,用于解释用户对操作系统的操作
• Shell 有很多
B shell;C shell;k shell;z shell
• cat /etc/shells
• CentOS 7 默认使用的 Shell 是 bash
# Shell脚本
● 基本组成元素:命令
● 一条命令只做一件事情
demo:cd /var ; ls ; pwd ; du –sh * ; du –sh
● bash脚本文件.sh
● 脚本文件需要执行权限 x chmod u+x .sh
● bash a.sh
● #!/bin/bash
Shell脚本组成
● #!/bin/bash
● 一系列命令
● 注释 #
● chmod u+x a.sh
● 执行脚本命令
● bash ./a.sh 不需要执行权限
● ./a.sh
● source ./a.sh
● . a.sh
### 内建命令和外部命令的区别内建命令和外部命令的区别
• 内建命令不需要创建子进程
• 内建命令对当前 Shell 生效
• type
### 管道和重定向
####1. 管道和管道符
• 管道和信号一样,也是进程通信的方式之一
• 匿名管道(管道符)是 Shell 编程经常用到的通信工具
• 管道符是“|”,将前一个命令执行的结果传递给后面的命令
• ls –l | more
• cat | ps -ef
• 分号和管道符 连接命令
####2. 子进程与子 Shell
• 子进程是 Shell 程序,称作子 Shell
####3. 重定向
• 一个进程默认会打开标准输入、标准输出(正确输出)、错误输出三个文件描述符0,1,2
• 输入重定向符号 “<” 读文件 从文件读数据
read var < /path/file
echo $var
• 输出重定向符号 “>” “>>” “2>” “&>” ”2>>” “&>>” 默认1>(正确输出)
2> 错误重定向 &> 正确和错误的都进行重定向
echo 123 > /path/file
demo: wc –l 等待输入的行数 ctrl+d结束 word count
wc –l < file
• << 分界符 读入数据,直到遇到分界符停止 自动化生成脚本
cat > /path/file << EOF
…
EOF
### 变量 没有类型
####1. 变量的定义
• 变量名的命名规则
• 字母、数字、下划线
• 不以数字开头
• 有意义的单词
####2. 变量的赋值
• 为变量赋值的过程,称为变量替换
• 变量名=变量值
• a=123
• 使用 let 进行运算
• let a=10+20
• 将命令赋给变量
• l=ls
• 将命令的结果赋给变量,$()或者``
• a=$(ls /etc)
• a=`ls /etc` 反引号 `` 1傍边的那个键
• 变量值有空格等特殊字符要包含在””或’’中
• string1=hello abc --- 错误
####3. 变量的引用
• ${变量名} 称作对变量的引用
• echo ${变量名} 查看变量的值 {}让系统知道是变量
• ${变量名} 与 $变量名 使用${}这种方式的好处是可以方便的实现两个变量的连接 比如路径
####4. 变量的作用范围
• 变量的默认作用范围
• 当前shell生效;子shell、平行shell或者shell的父进程都不生效
• demo:a=1
bash
• demo: var1=“hello abc”
四种执行脚本方式查看var1
• 变量的导出
• export --- 子shell可以使用父shell的变量 相当于将变量变成全局变量
• 变量的删除
• unset 变量
####5. 系统环境变量
• 环境变量:每个 Shell 打开都可以获得到的变量
• set 和 env 命令
• $PATH
命令搜索路径 重要
• $? 脚本命令的返回值 真:0 非0:假
• $$ 进程id $0 进程名
demo: 运行脚本
• $PS1
• 位置变量
• $1 $2…$n 赋值
demo: pos2=${2-_} 赋初值
####6. 环境变量配置文件
• 配置文件
• /etc/profile 1 最常用 四大配置文件 :1234 .文件名:隐藏文件
• /etc/bashrc 2
• /etc/profile.d/
• ~/.bashrc 3
• ~/.bash_profile 4
一:
• 对于/etc下的配置文件,所有用户都通用
• 对于家目录下的配置文件,是区分用户的,用户所特有的配置
二:
• login shell:命令就是,su – 用户名 nologin不能登录
所有的配置文件都会被执行
• nologin shell:命令就是,su 用户名
~/.bashrc和/etc/bashrc被执行,配置文件加载不完全
Demo:配置文件的加载
• 添加的环境变量,不会立即生效
• 如何立即生效
source /etc/bashrc 改完就执行source 重要
### 数组
• 定义数组
• hosts=( storage-1 storage-2 storage-3 )
• 显示所有元素
• echo ${hosts[@]}
• 显示数组元素个数
• echo ${#hosts[@]}
• 显示数组的第一个元素
• echo ${hosts[0]}
### 转义与引用
####1. 转义与引用 – 特殊字符
• 特殊字符:
• # 注释
• ; 分号
• \ 转义符号
• “和’ 引号 ‘’里面是啥就是啥 “”取变量的值 \”相当于单引号
####2. 转义与引用 – 转义符号
• 单个字符前的转义符号 echo -e “\n”
• \n 换行\r 回车(回到行首)\t 制表符 单个字母的转义
• \$ \” \\ 单个非字母的转义 --- 转义成普通符号
• demo: $a abc”x”def
####3. 转义与引用 – 引用
• 常用的引用符号
• “ 双引号
• ‘ 单引号
• ` 反引号
Demo: “$var1” ‘$var1’
### 运算符 shell计算性能差
####1. 赋值运算符
• = 赋值运算符,用于算数赋值和字符串赋值
• 使用 unset 取消为变量的赋值
• = 除了作为赋值运算符还可以作为测试操作符 相当于c语言的==
####2. 算数运算符 expr本身就是命令
• 使用 expr 进行运算
• expr 3 + 4 注意空格
expr不支持浮点数
• 基本运算符
• + - * / % \*转义 对于乘号需要转义
####3. 数字常量
• 数字常量的使用方法
• let “变量名 = 变量值”
• 变量值使用 0 开头为八进制
• 变量值使用 0x 开头为十六进制
bc
####4. 双圆括号
• 双圆括号是 let 命令的简化
• (( a = 10 ))
• (( a++ ))
• echo $((10+20))
Demo: expr
(( a=4+5 ))
(( a++ ))
(( a-- ))
### 测试与判断
####1. 退出与退出状态
• 退出程序命令
• exit --- shell脚本的退出命令,返回其上方命令的运行结果编码
• exit 10 返回10给 Shell,返回值非 0 位不正常退出
• $? 判断当前 Shell 下前一个进程是否正常退出
Demo: 脚本 exit
####2. 测试命令 test
• test 命令用于检查文件或者比较值
• test 可以做以下测试:
• 文件测试
• 整数比较测试
• 字符串测试
• test测试语句可以简化为 [ ] 符号 与if
• [ ] 符号还有扩展写法 [[ ]] 支持 && || < > !
• demo:man test
###### a. 字符串测试:
• STRING1 = STRING2 比较字符串
• STRING1 != STRING2
• -z STRING zero 是否为空 -n 是否为非空
• demo:man test
###### b.整数比较测试:
• INTEGER1 -eq INTEGER2 equal 等于
• INTEGER1 -ge INTEGER2 greater equal 大于等于
• INTEGER1 -gt INTEGER2 大于
• INTEGER1 -le INTEGER2 小于等于
• INTEGER1 -lt INTEGER2 小于
• INTEGER1 -ne INTEGER2 noequal 不等于
注意 [] 单方括号进行比较的时候,不能使用 < >
• demo:man test
###### c. 文件测试:
• -e FILE 判断文件是否存在 exist
• -d FILE 目录 判断是否是目录并且存在
• -f FILE 判断是否是文件并且存在
####3. 使用 if-then语句
• test 测试语句可以简化为 [ ] 符号
• if-then 语句的基本用法 不要吝啬空格 中括号中两端的空格一定要加上,十分重要
if [ 测试条件成立 ] 或命令返回值为0 if [ ]; then if [ ]; then if [ ]; then
命令
fi
命令
then 执行相应命令
四个空格+命令
fi 结束
Demo:1 判断用户 [ $UID = 0 ] [ $USER = “root” ] 注意空格
2 if 后跟命令 pwd 以及 abc
####4. 使用 if-then-else 语句
• if-then-else 语句可以在条件不成立时也运行相应的命令
if [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
Demo:
if [ $USER = root ]; then
echo “root user”
else
echo “other user”
fi
####5. 使用 if-elif-else 语句
• if-then-else 语句可以在条件不成立时也运行相应的命令
if [ 测试条件成立 ]
then 执行相应命令
elif [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
Demo: root user1 other
####6. If的嵌套
• if 条件测试中可以再嵌套 if 条件测试
if [ 测试条件成立 ]
then 执行相应命令
if [ 测试条件成立 ]
then 执行相应命令
fi
fi 结束
Demo:root用户+脚本存在,执行
### case 分支
• case语句
case “$变量” in
case "$pos" in case esac
模式1)
四个空格 cmd…
;;
模式2)
cmd…
;;
* )
cmd…
;;
esac
case 分支
Demo:.sh start/stop/restart/reload
### 循环
####1. 使用 for 循环遍历命令的执行结果
• for 循环的语法
for 参数 in 列表
do
执行的命令
done 结束
• 使用反引号或 $() 方式执行命令,命令的结果当作列表进行处理
####2. 使用 for 循环遍历变量和文本
• 列表中包含多个变量,变量用空格分隔
• 对文本处理,要使用文本查看命令取出文本内容
• 默认逐行处理,如果文本出现空格会当做多行处理
Demo:
# 回显
for i in {1..9}
# 修改文件名字
for file in `ls *.cpp`
扩展:basename a.cpp .cpp 取文件名 basename $file .cpp
####3. C 语言风格的 for 命令
for ((变量初始化;循环判断条件;变量变化))
do
循环执行的命令
done
Demo:
# 回显数值
for (( i=1 ; i<=10 ; i++ ))
####4. while 循环
while test测试是否成立
do
命令
done
####5. 死循环
while test测试⼀一直成立
do
命令
done
####6. until 循环
• until 循环与 while 循环相反,循环测试为假时,执行循环,为真时循环停止 直到成立就退出
Demo:
# while [ $a -lt 10 ] ; do done while空格:(死循环)空格
((a++))
# 死循环
while :
sleep 2
# util 条件为假 执行
util [ 5 –lt 4 ];
do
echo always
done
### 循环的使用
• 循环和循环可以嵌套
• 循环中可以嵌套判断,反过来也可以实现嵌套
• 循环可以使用 break 和 continue 语句在循环中退出
Demo:
# 循环嵌套if的demo /etc/profile.d/*.sh
# 九九乘法表 echo -n 后面紧跟着的echo不换行 echo -e 转义符号
####1. break 循环直接结束
####2. continue 结束本次循环,进入到下一次循环
Deno:# 打印数字,break和continue 结束循环和结束本次循环
####3. 使用循环处理命令行参数
• 命令行参数可以使用 $1 $2 … ${10}… $n 进行读取
• $0 代表脚本名称
• $*(常用) 和 $@ 代表所有位置参数
• $# 代表位置参数的数量
Demo:根据入参名称不同,执行不同的结果
for pos in $*
do
do something
done
或者
while [ $# -ge 1 ]
do
do something
shift 左移
done
### 函数
• 自定义函数
• 系统脚本
####1. 自定义函数
• 函数用于“包含”重复使用的命令集合
• 自定义函数
function fname() {
命令
}
• 函数的执行
• fname
Demo: #编写脚本 实现 cd 和 du –sh 的函数
####2. 自定义函数 默认都是全局变量
• 函数作用范围的变量
• local 变量名 变成局部变量
• 函数的参数
• $1 $2 $3 … $n
Demo:1 输入目录名参数,实现 du –sh disk usage
2 checkpid是否存活,一个pid和多个pid输入 grep -w pid 完全匹配 grep -v grep 排除grep命令 grep -v $0
$0 进程名
####3. 系统脚本
• 系统自建了函数库,可以在脚本中引用
• /etc/init.d/functions
• 自建函数库
• 使用 source 函数脚本文件“导入”函数
Demo: echo_success
source /etc/init.d/functions 先调用函数库才能使用系统函数
### 脚本控制
• 脚本所占资源的控制
• 避免出现“不可控的”死循环
• 死循环导致cpu占用过高
• 死循环导致死机
Demo:经典的fork炸弹
function func() { func | func & }
可简写为
.() { .|.& };.
### 捕获信号
• 捕获信号脚本的编写
• kill默认会发送15号信号给应用程序
• ctrl+c发送2号信号给应用程序
• kill -9 9号信号不可堵塞
Demo:trap “echo signal 15” 15
脚本
使用while :死循环查看捕获信号效果
### 计划任务
• 一次性计划任务 at 系统自动执行 必须用绝对路径
Demo: # at 时间 + 写脚本的绝对路径
ctrl+d提交
atq 查询
atrm 任务号 删除
at -c 任务号 #查看任务具体内容
systemctl start atd
### 一次性计划任务
at 时间格式
at 指定时间的方法很丰富:
hh:mm 小时:分钟(当天,如果时间已过,则在第二天执行);
midnight(深夜),noon(中午),teatime(下午茶时间,下午4点),today,tomorrow等;
12小时计时制,时间后加am(上午)或pm(下午);
指定具体执行日期:mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年);
相对计时法:now + n units,now是现在时刻,n为数字,units是单位(minutes、hours、days、weeks)