文章目录
1. 目录结构
Linux的目录结构是一个树型结构
Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘
Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面
目录 | 作用 |
---|---|
/bin | 二进制命令所在的目录 |
/boot | 系统引导程序所需要的文件目录 |
/dev | 设备软件目录,磁盘,光驱, |
/etc | 系统配置,启动程序 |
/home | 普通用户的家,目录默认数据存放目录 |
/lib | 共享库文件和内核模块存放目录 |
/mnt | 临时挂载储存设备的挂载点 |
/opt | 额外的应用软件包 |
/proc | 操作系统运行时,进程信息和内核信息存放在这里 |
/root | Linux超级权限用户root的家目录 |
/sbin | 和管理系统相关的命令,【超级管理员用】 |
/tmp | 临时文件目录,这个目录被当作回收站使用 |
/usr | 用户或系统软件应用程序目录 |
/var | 存放系统日志的目录 |
![](https://img-blog.csdnimg.cn/196eb8a5cf9447e7bb62f8f4e488bef2.png#pic_center)
2. 操作命令
Linux刚面世时并没有图形界面,所有的操作全靠命令完成,形成了对应的操作习惯。在职场中,大量的服务器维护工作都是在远程通过SSH客户端(比如XShell) 来完成的, 并没有图形界面, 所有的维护工作都需要通过命令来完成。作为后端程序员,掌握常见Linux命令已经成为一项必备技能,必须要或多或少的掌握一些Linux常用的终端命令。
2.1 命令格式
格式:
命令名称 可选项 参数
命令名称:相应功能的英文单词或单词的缩写
可选项:可用来对命令进行控制, 也可以省略
参数:传给命令的参数, 可以是 零个、一个 或者 多个
2.2. 查看文件列表
ls 是英文单词list的简写, 其功能为列出目录的内容,是用户最常用的命令之一
常用可选项说明:
只使用ls命令就只能看到当前目录下非隐藏 文件。
选项 | 含义 |
---|---|
-a | 显示指定目录下所有子目录与文件, 包含隐藏文件 |
-l | 以列表方式显示文件的详细信息 |
-h | 配合 -l 以人性化的方式显示文件大小 |
常见使用方式:
ls 查看当前目录内容 (缺点: 隐藏文件看不到)
ls -a 查看当前目录内容 ,包括隐藏文件
ls -al 查看目录内容的详细信息(查看文件类型、权限、大小等)
ls -lh 查看目录内容的详细信息,以K,M,G方式显示文件大小
ls /root 查看/root目录下内容
[root@node01 ~]# ls -a
. anaconda-ks.cfg .bash_logout .bashrc .config .dbus .ICEauthority .local .tcshrc 模板 图片 下载 桌面
.. .bash_history .bash_profile .cache .cshrc .esd_auth initial-setup-ks.cfg .mozilla 公共 视频 文档 音乐
2.3. 目录查看、目录创建和目录删除命令
目录查看命令 pwd
查看当前所在目录
[root@node01 ~]# pwd
/root
目录创建命令mkdir
注意: 新建目录的名称 不能与当前目录中 已有的目录或文件同名
1)创建没有层级关系的目录
[root@node01 ~]# mkdir test
[root@node01 ~]# ls
anaconda-ks.cfg initial-setup-ks.cfg test 公共 模板 视频 图片 文档 下载 音乐 桌面
2)创建有层级的目录
mkdir -p 目录1/目录2/目录3
[root@node01 ~]# mkdir -p test02/aa/bb
目录删除命令rm
常用可选项说明:
参数 | 含义 |
---|---|
-f | 强制删除,忽略不存在的文件或目录, 无需提示 |
-r | 递归地删除目录下的内容, 删除目录时必须加此参数 |
rm -r 目录 #删除目录有提醒
[root@node2 /]# rm -r test
rm:是否进入目录"test"? y
rm:是否删除目录 "test/test02"?y
rm:是否删除目录 "test"?y
rm -fr 目录 #直接删除目录(不管有没有内容)
[root@node01 ~]# rm -rf test
[root@node1 ~]#
2.4. 目录切换命令
cd 是英文单词 change directory 的缩写, 其功能为更改当前的工作目录, 也是用户最常用的命令之一
注意: linux的所有 目录 和 文件名 都是大小写敏感的
命令 | 含义 |
---|---|
cd | 切换到用户主目录(root用户主目录是/root,其他用户是/home/用户名) |
cd 目录 | 切换到指定目录下 |
cd .. | 切换到上级目录 |
cd ../.. | 切换到上上一级目录 |
cd ../dir | 回到上一级的dir目录 |
cd - | 可以在最近的两次目录之间切换,返回上一次的工作目录 |
cd test | 切换到当前目录下的test目录(相对路径) |
cd /root/test | 切换到指定目录(绝对路径) |
2.5. 文件操作命令
2.5.1. touch
touch命令创建文件
常见使用方式:
命令 | 含义 |
---|---|
touch a.txt | 在当前目录创建a.txt文件 |
touch /root/a.txt | 在/root目录创建a.txt文件 |
2.5.2. mv
通过mv 命令可以用来移动文件或目录, 也可以给文件或目录重命名
将文件移动另一个目录中:
mv 文件 目录/
touch a.txt
mkdir dir
mv a.txt dir
ls dir
重命名
mv 旧文件名 新文件名
mv a.txt b.txt #重命名文件
mv dir1 dir2 #重命名目录
将目录移动 到 另一个目录中:
mv 被移动目录 目标目录
mv dir1 /
文件删除rm:
rm -f 文件名
rm -f a.txt #强制删除一个文件
2.5.3. cat
查看文件内容
cat /root/initial-setup-ks.cfg
2.5.4. cp
复制文件
cp a.txt dir1 #将a.txt复制到dir1目录
cp a.txt b.txt #将a.txt复制到b.txt
2.5.5. more
分屏显示长文件内容
常用参数说明:
-num 一次显示的行数
-d 提示使用者,在画面下方显示 [Press space to continue, 'q' to quit.] ,如果使用者按错键,则会显示 [Press 'h' for instructions.] 而不是 '哔' 声
-l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
+/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示
逐页显示 file1 文档内容,如有连续空白行则以一行空白行显示
#more -s file1
This is a test file.
Welcome to linuxdaxue.com!
This is cat command test.
从第二行开始显示file1文档的内容
#more +2 file1
Welcome to linuxdaxue.com!
This is cat command test.
设定每屏显示的行数
#more -2 file1
This is a test file.
Welcome to linuxdaxue.com!
--More--(64%)
常用操作说明:
Enter 向下n行,需要定义。默认为1行
Ctrl+F 向下滚动一屏
空格键(space) 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
V 调用vi编辑器
!命令 调用Shell,并执行命令
q 退出more
2.5.6. less
通过 less [参数] 文件名
命令可以用于分屏显示文件内容, 每次只显示一页内容
通常用于分屏显示文件内容 或者 根据关键词搜索内容
分屏显示文件内容
less -N 文件名 显示文件内容 且 显示行号
操作键 | 功能 |
---|---|
空格键 | 显示手册页的下一屏幕 |
Enter 键 | 一次滚动手册页的一行 |
b | 回滚一屏 |
f | 向前一屏 |
q | 退出 |
/word | 搜索word字符串 |
根据关键词 搜索
# 根据关键词搜索
/word
操作键 | 功能 |
---|---|
n | 向下找 |
N | 向上找 |
2.5.7. head
查看文档的前几行内容
head -n 数字 文件
[root@node01 ~]# head -n 5 test01.data
aaa
2.5.8. tail
查看文档(日志)的后几行内容
查看文档的最后10行内容
tail -10 文件
动态显示文档的最后内容,一般用来查看日志
tail -f 文件名
动态显示文档的最后100行内容
tail -100f 文件名
2.6.压缩和解压缩
常用可选项说明:
参数 | 解释 |
---|---|
-c | 创建一个新tar文件 |
-v | 显示运行过程的信息 |
-f | 指定文件名 |
-z | 调用gzip压缩命令进行压缩 |
-t | 查看压缩文件的内容 |
-x | 解开tar文件 |
2.6.1. 解压缩
tar -zxvf 压缩文件 [-C] [指定解压目录]
tar -zxvf redis-3.2.8.tar.gz #将文件解压到当前目录
tar -zxvf redis-3.2.8.tar.gz -C /root/dir #将文件解压到指定目录
2.6.2. 压缩
tar -c[z]vf 压缩文件 目录
tar -cvf test.tar /root/test #打包
tar -czvf test.tar.gz /root/test #打包并压缩
2.7. 文件查找
2.7.1. find
用于查找符合条件的文件
find -name 'ins*' #查找/目录下以文件名ins开头的文件
find -type f -size +100M #查找/目录下文件大小大于100M的文件
2.7.2. grep
搜索存在 关键字 的行
搜索 存在关键字的行
grep 关键字 文件名
搜索 存在关键字的行且显示行号
grep -n 关键字 文件名
忽略大小写搜索存在关键字的行
grep -i 关键字 文件名
搜索不存在关键字的行
grep -v 关键字 文件名
搜索以关键字开始的行或以关键字结尾的行
grep 正则 文件名
参数 | 含义 |
---|---|
^a | 行首,搜索以a开头的行 |
b$ | 行尾,搜索以b结束的行 |
2.7.3. which
查看可执行文件的位置。
which pwd #查找pwd命令的路径
2.8. 系统管理命令
2.8.1. ps
列出所有在内存当中的进程
ps aux
ps命令用来列出系统中当前运行的那些进程
ps -ef #查看所有进程
2.8.2. kill命令
用于终止执行中的程序
kill -9 12345 #杀死pid为12345的进程
2.8.3. 管道命令
是将一个命令的输出用作另一个命令的输入
ps -ef | grep java #查询名称中包含java的进程
2.9. 用户的创建和删除命令
2.9.1. 用户创建和密码设置
useradd user01 #创建新用户kkb
passwd user01 #设置用户kkb密码
2.9.2. 删除用户
[root@node2 home]# userdel -r user01
userdel: user user01 is currently used by process 10134
[root@node2 home]# kill -9 10134
已杀死
2.10. 权限管理命令
2.10.1. 权限概述
在Linux操作系统中,每当我们使用用户名登录操作系统时,Linux都会对 该用户进行认证、授权审计等操作。操作系统为了识别每个用户,会给每个用户定义一个ID,就是 UID。
用户组就相当于多个用户的容器;在Linux系统中,用户组也有一个ID,GID。
在Linux操作系统中,root的权限是最高的,相当于windows的administrator,拥有最高权限, 能执行任何命令和操作,而其他用户都是普通用户。
Linux对文件创建者(所属用户),所属用户组,其他用户都赋予不同的权限。
2.10.2. 文件权限说明
对 文件 / 目录 的权限包括:
序号 | 权限 | 英文 | 缩写 | 数字序号 |
---|---|---|---|---|
01 | 读 | read | r | 4 |
02 | 写 | write | w | 2 |
03 | 执行 | execute | x | 1 |
04 | 无权限 | - | 0 |
![](https://img-blog.csdnimg.cn/32545cee9b3c47ebbb4a831443f5aca3.png#pic_center)
![](https://img-blog.csdnimg.cn/b094cf5b6e3c40a281cd997d705cb858.png#pic_center)
r: 对文件是指可读取内容 对目录是可以ls
w: 对文件是指可修改文件内容,对目录 是指可以在其中创建或删除子节点(目录或文件)
x: 对文件是指是否可以运行这个文件,对目录是指是否可以cd进入这个目录
2.10.3. chmod
用来变更文件或目录的权限
chmod 666 a.txt
chmod u+x a.txt
chmod u=rwx,g=rw,o=x a.txt
2.10.4. su
用于切换用户,普通用户不能使用某些权限, 所以需要切换用户。
序号 | 命令 | 作用 | 说明 |
---|---|---|---|
01 | su - 用户名 | 切换用户, 并且企划目录 | - 可以切换到用户家目录, 否则保持位置不变 |
02 | exit | 退出当前登录用户 |
[zhangsan@node01 ~]$ whoami
zhangsan
[zhangsan@node01 ~]$ su - root
Password:
[root@node01 ~]# whoami
root
[root@node01 ~]# exit
logout
[zhangsan@node01 ~]$ whoami
zhangsan
sudo
虽然通过 su -u root
可以切换到root用户,但是存在严重的安全隐患。在大多数版本的Linux中, 都不推荐直接只用 root 账号登录系统。
sudo
命令用来以其他身份来执行命令,预设的身份为 root
;用户使用 sudo
时, 必须先输入密码,之后5分钟的有效期限,超过期限则必须重新输入密码。
2.11. 网络和服务管理命令
2.11.1. hostname
查看主机名
[root@node01 ~]# hostname
node1
2.11.2. ifconfig
查看主机ip地址
[root@node01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.108.130 netmask 255.255.255.0 broadcast 192.168.108.255
inet6 fe80::9083:b166:48a8:aad6 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:51:76:a8 txqueuelen 1000 (Ethernet)
RX packets 1768 bytes 151002 (147.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1334 bytes 121420 (118.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2.11.3. service
用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
service network status #查看网络服务状态
service network stop #停止网络服务
service network start #启动网络服务
service network restart # 重启网络服务
2.12. 其它
2.12.1. man
是manual的缩写,是Linux提供的一个手册,包含了绝大部分的命令、函数的详细使用说明。
常用操作键:
操作键 | 功能 |
---|---|
空格键 | 显示手册的下一屏 |
Enter键 | 一次滚动首页也得一行 |
b(back) | 回滚一屏 |
f(forward) | 前滚一屏 |
q (quit) | 退出 |
/word | 搜索word字符串 |
n(next) | 搜索下一个 |
N | 搜索上一个 |
[root@node01 ~]# man ls
2.12.2. echo
将字符串输出到控制台 , 通常会和重定向联合使用
[root@node01 ~]# echo 'hello'
hello
2.12.3. 重定向 >
(覆盖) 和 >>
(追加)
重定向 >
(覆盖)
[root@node01 ~]# echo 'hello01'>test02.data
[root@node01 ~# cat test02
test02/ test02.data
[root@node01 ~]# cat test02.data
hello01
>>
(追加)
[root@node01 ~]# echo 'hello02' >> test02.data
[root@node01 ~]# cat test02.data
hello01
hello02
2.12.4. && 和 ||
&&
如果命令1执行成功,才会执行命令2
mkdir -p 正确目录 && echo "提示创建目录成功"
||
如果命令1执行失败,才会执行命令2
mkdir 错误目录 || echo "提示创建目录失败"
2.12.5. ln
可以用来创建软连接,类似于创建快捷方式
[root@node01 ~]# ln -s test02.data test03.data
[root@node01 ~]# ll
总用量 16
-rw-------. 1 root root 1496 11月 13 11:57 anaconda-ks.cfg
-rw-r--r--. 1 root root 1544 11月 13 12:04 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 11月 15 16:17 test
-rw-r--r--. 1 root root 4 11月 15 17:10 test01.data
drwxr-xr-x. 3 root root 16 11月 15 16:19 test02
-rw-r--r--. 1 root root 16 11月 15 20:23 test02.data
lrwxrwxrwx. 1 root root 11 11月 15 21:06 test03.data -> test02.data
drwxr-xr-x. 2 root root 6 11月 13 14:14 公共
drwxr-xr-x. 2 root root 6 11月 13 14:14 模板
drwxr-xr-x. 2 root root 6 11月 13 14:14 视频
drwxr-xr-x. 2 root root 6 11月 13 14:14 图片
drwxr-xr-x. 2 root root 6 11月 13 14:14 文档
drwxr-xr-x. 2 root root 6 11月 13 14:14 下载
drwxr-xr-x. 2 root root 6 11月 13 14:14 音乐
drwxr-xr-x. 2 root root 6 11月 13 14:14 桌面
2.12.6. clear
清屏命令,还可以使用快捷方式:ctrl + l
2.12.8. 自动补全命令
-
自动补全命令
在敲出 文件/ 目录 / 命令 的前几个字母之后, 按下
tab
键如果还存在其他 文件 / 目录 / 命令, 再按一下tab键, 系统会提示可能存在的命令
-
曾经使用过的命令
使用
上
/下
光标键可以在曾经使用过的命令之间来回切换如果想要退出选择, 并且不想执行当前选中的命令, 可以按
ctrl + c
3. vi编辑器
3.1. 概述
vi是visual interface的简称, 是Linux中最经典的文本编辑器
vi的核心设计思想:让程序员的手指始终保持在键盘的核心区域, 就能完成所有编辑操作
vi的特点:
1.只能是编辑文本内容, 不能对字体段落进行排版
2.不支持鼠标操作
3.没有菜单
4.只有命令
3.2. 使用方式
vi a.txt #直接打开文件
vi a.txt +10 #直接打开文件,并定位到第10行
Vi编辑器三种模式:
- 命令模式
- 打开文件首先进入命令模式, 是使用vi的入口
- 通过 命令 对文件进行常规的编辑操作, 例如 定位 翻页 复制 粘贴 删除
- 在其他图形编辑器下, 通过 快捷键 或者 鼠标 实现的操作, 都在 命令模式 下实现
- 末行模式 – 执行 保存 退出等操作
- 要退出 vi 返回到控制台, 需要在莫行模式下输入命令
- 末行模式 是 vi 的出口
- 编辑模式 – 正常的编辑文字
3.3. 命令模式常用命令
命令 | 功能 |
---|---|
o | 在当前行后面插入一空行 |
O | 在当前行前面插入一空行 |
dd | 删除光标所在行 |
ndd | 从光标位置向下连续删除 n 行 |
yy | 复制光标所在行 |
nyy | 从光标位置向下连续复制n行 |
p | 粘贴 |
u | 撤销上一次命令 |
gg | 回到文件顶部 |
G | 回到文件末尾 |
/str | 查找str |
3.4. 底行模式常用模式
命令 | 功能 |
---|---|
:w 文件 | 另存为 |
:w | 保存(ctrl + s) |
:q | 退出, 如果没有保存,不允许退出 |
:q! | 强行退出, 不保存退出 |
:wq | 保存并退出 |
:x | 保存并退出 |
:set nu | 设置行号 |
:%s/旧文本/新文本/g | 文本替换 |
4. 文本操作常用命令
4.1. cut
根据条件 从命令结果中提取对应内容
截取出test02.data文件中前2行的第5个字符
参数说明:
参数 | 英文 | 含义 |
---|---|---|
-c | characters | 按字符选取内容 |
[root@node01 ~]# head -2 test02.data|cut -c 5
o
u
截取出test03.data文件中前2行以”:”进行分割的第1,2,3段内容
参数说明:
参数 | 含义 |
---|---|
-d '分隔符' | 指定分隔符 |
-f n1,n2 | 分割以后显示第几段内容, 使用 , 分割 |
显示范围控制:
范围 | 含义 |
---|---|
n | 只显示第n项 |
n- | 显示 从第n项 一直到行尾 |
n-m | 显示 从第n项 到 第m项(包括m) |
[root@node01 ~]# head -2 test03.data|cut -d ':' -f 2,3,4
aa:sgx:abc
bb:sgx0011:jkl
4.2. sort
针对文本文件的内容,以行为单位来排序
字符串排序
[root@node01 ~]# cat test04.data
apple
orange
banana
pear
[root@node01 ~]# cat test04.data|sort
apple
banana
orange
pear
字符串去重排序
使用参数说明:
参数 | 含义 |
---|---|
-u | 去掉重复的 |
[root@node01 ~]# cat test04.data
apple
orange
pear
banana
pear
[root@node01 ~]# sort -u test04.data
apple
banana
orange
pear
数值排序
使用参数说明:
参数 | 含义 |
---|---|
-n | 按照数值大小排序 |
-r | 使次序颠倒 |
按照默认顺序排序:
[root@node01 ~]# cat test05.data
1
2
4
3
10
5
9
11
[root@node01 ~]# sort test05.data
1
10
11
2
3
4
5
9
按照升序排序:
[root@node01 ~]# sort -n test05.data
1
2
3
4
5
9
10
11
按照倒序排序:
[root@node01 ~]# sort -n -r test05.data
11
10
9
5
4
3
2
1
[root@node01 ~]# sort -nr test05.data
11
10
9
5
4
3
2
1
4.3. wc
统计指定文件字节数、单词数、行数信息
常用参数说明:
参数 | 含义 |
---|---|
-c | 字节数 |
-w | 单词数 |
-l | 行数 |
显示文件字节数、单词数、行数
[root@node01 ~]# cat test04.data
apple
orange
pear
banana
pear
[root@node01 ~]# wc test04.data
5 5 30 test04.data //行数、单词数、字节数
仅显示文件行数
[root@node01 ~]# wc -l test04.data
5 test04.data
仅显示文件单词数
[root@node01 ~]# wc -w test04.data
5 test04.data
仅显示文件字节数
[root@node01 ~]# wc -c test04.data
30 test04.data
统计多个文件的行数、单词数、字节数
[root@node01 ~]# wc test02.data test04.data test05.data
2 2 50 test02.data
5 5 30 test04.data
8 8 18 test05.data
15 15 98 总用量
4.4. awk
实现模糊查询、按需提取字段、判断、运算等。
搜索zhangsan和lisi的成绩
命令格式:
awk ‘/搜索字符/’ score.txt 从score.txt 搜索含有 "搜索字符"的行
[root@node01 ~]# cat score.data
zhangsan 85 90 100
duyi 90 75 90
lisi 65 70 95
wangwu 75 80 90
[root@node01 ~]# awk '/zhangsan|lisi/' score.data
zhangsan 85 90 100
lisi 65 70 95
使用指定分隔符分割行,指定下标显示内容
命令格式:
awk -F ‘分隔符’ ‘{print $1, $2, $3}’ 按照指定分隔符分割文件中每行,并打印第一、二、三列
[root@node01 ~]# cat score.data|awk -F ' ' '{print $1,$2,$3}'
zhangsan 85 90
duyi 90 75
lisi 65 70
wangwu 75 80
使用指定分隔符分割行,指定下标显示内容,指定输出分隔符
命令格式:
awk -F ’ ’ ‘{OFS="==="}{print $1, $2, $3}’
使用空格分割每一行,输出第一、二、三列,每列间使用指定"==="分开
[root@node01 ~]# cat score.data|awk -F ' ' '{OFS="==="}{print $1,$2,$3}'
zhangsan===85===90
duyi===90===75
lisi===65===70
wangwu===75===80
使用函数
命令格式:
awk -F ’ ’ ‘{print toupper($1)}’
使用空格分割每一行,输出第一列内容,并把第一列内容转大写
[root@node01 ~]# cat score.data|awk -F ' ' '{print toupper($1)}'
ZHANGSAN
DUYI
LISI
WANGWU
条件选择筛选
命令格式:
awk -F ’ ’ ‘{if($4>60) print $1, $4 }’ score.data
使用空格分割每一行,如果分割后第4列成绩大于60分,则输出第一、四列内容
[root@node01 ~]# cat score.data
zhangsan 85 90 100
duyi 90 75 90
lisi 65 70 95
wangwu 75 80 56
[root@node01 ~]# cat score.data | awk -F ' ' '{if($4>60) print $1,$4}'
zhangsan 100
duyi 90
lisi 95
4.5. sed(stream editor)
对文件内容进行过滤和替换
完成查询功能
常用可选项说明:
可选项 | 含义 |
---|---|
p | 打印 |
$ | 代表 最后一行 |
-n | 仅显示处理后的结果 |
-e | 根据表达式进行处理 |
列出文本中3-5行内容
[root@node01 ~]# cat test05.data
1
2
4
3
10
5
9
11
[root@node01 ~]# cat test05.data|sed -n -e '3,5p'
4
3
10
列出文本中含有"an"的行
[root@node01 ~]# cat test04.data
apple
orange
pear
banana
pear
[root@node01 ~]# cat test04.data|sed -n -e '/an/p'
orange
banana
列出列出文本中含有"an"的行,不区分大小写,并显示行号
[root@node01 ~]# cat test04.data
apple
orange
pear
banana
pear
Animal
[root@node01 ~]# cat test04.data|sed -n -e '/an/Ip'
orange
banana
Animal
删除文本行
可选项 | 含义 |
---|---|
d | 删除指定内容 |
删除前3行内容
[root@node01 ~]# cat -n test04.data | sed -e '1,3d'
4 banana
5 pear
6 Animal
保留前3行内容
[root@node01 ~]# cat -n test04.data | sed -e '4,$d'
1 apple
2 orange
3 pear
修改文本内容
参数 | 含义 |
---|---|
i | 目标前面 插入内容 |
a | 目标后面 追加内容 |
在第二行后添加"aaa",并显示行号
[root@node01 ~]# cat -n test04.data|sed -e '2a aaa'
1 apple
2 orange
aaa
3 pear
4 banana
5 pear
6 Animal
在第二行前添加"aaa",并显示行号
[root@node01 ~]# cat -n test04.data|sed -e '2i aaa'
1 apple
aaa
2 orange
3 pear
4 banana
5 pear
6 Animal
替换文本内容
把文本中apple替换成abc
[root@node01 ~]# cat -n test04.data|sed -e 's/apple/abc/'
1 abc
2 orange
3 pear
4 banana
5 pear
6 Animal
5. Shell编程
5.1. 概述
Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell脚本编程,不是指开发 shell 自身。
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 解释器 种类众多,一个系统可以存在多个 shell解释器,可以通过 cat /etc/shells 命令查看系统中安装的 shell解释器。
Bash 由于易用和免费,在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
可以以下方式查看Shell解释器:
[root@node01 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
5.2. HelloWorld
(1)创建/export/exec01.sh
#!/bin/bash
echo 'HelloWorld'
(2)赋予可执行权限
[root@node01 export]# chmod 777 exec01.sh
[root@node01 export]# ls
exec01.sh
(3)执行脚本
[root@node01 export]# /bin/sh exec01.sh
HelloWorld
[root@node01 export]# /bin/bash exec01.sh
HelloWorld
[root@node01 export]# ./exec01.sh
HelloWorld
执行方式一和二中 ,sh是bash的快捷方式
执行方式三可以执行,是因为在环境变量PATH中已经配置了/bin目录,所以可以直接到/bin目录下查找相关命令
5.3. 变量
5.3.1. 变量规则
- 变量名称没有任何修饰符
- 变量名和等号之间,等号和初始化值之间不能有空格
- 变量名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用
bash
里的关键字(可用help命令查看保留关键字) - 赋值方式可以直接赋值,也可以把某命令执行结果赋值给变量
for file in `ls /export`
以上语句会把"/export"下的文件名称一一列出
语句中使用的"`"是反单引号
5.3.2. 使用变量
使用$引用已定义变量
#!/bin/bash
myname="zhangsan"
echo $myname
echo ${myname}
[root@node01 export]# ./exec01.sh
zhangsan
zhangsan
使用${变量名}的方式来引用已定义变量,通常情况下{}可省;但如果使用{}是为了定义变量边界,则{}不可省
for skill in java php python; do
echo "I am good at ${skill}Script"
done
以上程序中{}不可省,其是为了指明引用skill变量,而不是skillScript
重新定义变量
#!/bin/bash
myname="zhangsan"
echo $myname
myname="lisi"
echo $myname
[root@node01 export]# ./exec01.sh
zhangsan
lisi
重新定义变量时不要加 符 号 , 只 有 使 用 变 量 时 才 加 符号,只有使用变量时才加 符号,只有使用变量时才加符号
5.3.3. 删除变量
使用 unset 命令可以删除变量
#!/bin/bash
myname="zhangsan"
echo $myname
unset myname
echo $myname
[root@node01 export]# ./exec01.sh
zhangsan
//第二次没有输出,变量myname已被删除
5.3.4. 常量
变量一旦被赋值,就不可再改变其值
使用readonly修饰,可以变量改变为常量
#!/bin/bash
myname="zhangsan"
readonly myname
myname="lisi"
[root@node01 export]# ./exec01.sh
./exec01.sh:行4: myname: 只读变量
- 在使用EverEdit直接在windows中编辑shell文件后想要输出时报的错:
-bash: ./demo04.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
原因:
在win下编辑的时候,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r
用指令:
sed -i 's/\r$//' build.sh
会把 build.sh 中的\r 替换成空白!
5.4. 字符串
5.4.1. 字符串的定义和使用
字符串是shell编程中最常用数据类型,定义字符串可以使用单引号、双引号、也可以不使用引号
使用单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
#!/bin/bash
myname='zhangsan'
echo '$myname'
[root@node01 export]# ./exec01.sh
$myname
使用双引号
双引号里可以引用变量
双引号里可以出现转义字符
#!/bin/bash
myname='zhangsan'
echo "$myname"
[root@node01 export]# ./exec01.sh
zhangsan
5.4.2. 字符串常见功能
获取字符串长度
#!/bin/bash
myname='zhangsan'
echo "$myname"
echo "${#myname}"
[root@node01 export]# ./exec01.sh
zhangsan
8
截取字符串子串
从第2个字符开始截取,截取到字符串末尾
#!/bin/bash
myname='zhangsan'
str=" my name is ${myname}"
echo "${str:2}"
[root@node01 export]# ./exec01.sh
my name is zhangsan
从第2个字符开始截取,截取2个字符
#!/bin/bash
myname='zhangsan'
str=" my name is ${myname}"
echo "${str:2:2}"
[root@node01 export]# ./exec01.sh
my
查找子串
查找字符串中is的位置
#!/bin/bash
myname='zhangsan'
str="my name is ${myname}"
echo `expr index "${str}" is`
[root@node01 export]# ./exec01.sh
9
5.5. 传递参数
我们在执行shell脚本时,可以向shell脚本中传递参数,在shell脚本中使用这些传入的参数
使用方式:
./exec01.sh 参数01 参数02 …
脚本内获取参数的格式为:$n
n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
#!/bin/bash
echo "shell脚本接收参数测试:"
echo "执行的文件名: $0"
echo "接收的第一个参数: $1"
echo "接收的第二个参数: $2"
[root@ode01 export]# ./exec01.sh a b
shell脚本接收参数测试:
执行的文件名: ./exec01.sh
接收的第一个参数: a
接收的第二个参数: b
使用特殊字符来处理参数接收:
参数 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与 ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数 |
$- | 显示Shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
#!/bin/bash
echo "shell脚本接收参数测试:"
echo "接收的第一个参数: $1"
echo "接收的参数个数: $#"
echo "接收的参数列表: $*"
[root@node01 export]# ./exec01.sh a b
shell脚本接收参数测试:
接收的第一个参数: a
接收的参数个数: 2
接收的参数列表: a b
其中$*和$@的区别:
$*会把接收到的参数"a b"作为一个参数使用,而$@会把接收到的参数"a" "b"作为两个参数接收
#!/bin/bash
echo '$*和$@区别演示:'
echo '$*演示:'
for i in "$*";do
echo $i
done
echo '$@演示:'
for i in "$@";do
echo $i
done
、
[root@node01 export]# ./exec01.sh a b
$*和$@区别演示:
$*演示:
a b
$@演示:
a
b
5.6.算术运算符
Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。
原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如expr。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
使用expr表达式时要注意:
操作数和运算符之间要有空格 ,例如2 + 2
,而不能写成2+2
完整的表达式要被 ` 包含,注意不是单引号,在 Esc 键下边
#!/bin/bash
val=`expr 2 + 2`
echo "$val"
[root@node01 export]# ./exec01.sh
4
常用算术运算符说明:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
**注意:**条件表达式要放在方括号之间,并且操作数和运算符之间要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
#!/bin/bash
a=20
b=10
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a / $b`
[root@node01 export]# ./exec01.sh
30
10
200
2
5.7. 程序流程
5.7.1. 条件分支结构
5.7.1.1. if条件分支
常用的判定条件运算符:
只支持数字,不支持字符串,除非字符串的值是数字
运算符 | 说明 |
---|---|
-eq | 检测两个数是否相等,相等返回 true |
-ne | 检测两个数是否不相等,不相等返回 true |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true |
#!/bin/bash
a=20
b=10
#单if模式
if [ $a -gt $b ]; then
echo "a大于b"
fi
#ifelse模式
scorea=65
if [ $scorea -gt 60 ]; then
echo "成绩合格"
else
echo "成绩不合格"
fi
#ifelse多分支
scoreb=95
if [ $scoreb -gt 90 ]; then
echo "成绩优秀"
elif [ $scoreb -gt 80]; then
echo "成绩中上"
elif [ $scoreb -gt 70 ]; then
echo "成绩中等"
elif [ $scoreb -gt 60 ]; then
echo "成绩及格"
else
echo "成绩不及格"
fi
运行结果如下:
[root@node01 export]# ./exec01.sh
a大于b
成绩合格
成绩优秀
5.7.1.2. case条件分支
用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
执行流程说明:
取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
#!/bin/bash
a=20
case $a in
10) echo "a是10"
;;
20) echo "a是20"
;;
*) echo "a什么都不是"
;;
esac
[root@node01 export]# ./exec02.sh
a是20
5.7.2. 循环结构
5.7.2.1. for循环
使用循环遍历1-5
#!/bin/bash
for i in 1 2 3 4 5; do
echo $i
done
for i in {1..5}; do
echo $i
done
使用循环遍历1-5中的奇数
#!/bin/bash
for i in {1..5..2}; do
echo $i
done
使用遍历访问"/export"目录下的内容
#!/bin/bash
for i in `ls /export`; do
echo $i
done
5.7.2.2. while循环
输出1-10的和值
#!/bin/bash
sum=0
i=1
while [ $i -le 10 ]; do
sum=$[sum + i]
i=$[i + 1]
done
echo $sum
2.5.7.2.3. 无限循环
每隔1秒,输出当前系统时间
#!/bin/bash
while true; do
date
sleep 1
done
5.7.2.4. break和continue
break
直接提出所有循环
使用无限循环输出系统时间,每隔一秒输出一次,使用break控制只输出10次
#!/bin/bash
i=1
while true; do
if [ $i -gt 10 ];then
break
fi
echo $i
date
sleep 1
i=$[i + 1]
done
continue
仅跳出当前次循环
遍历输出1-20,跳过3的倍数
#!/bin/bash
for i in {1..20};do
if test $[ i % 3 ] -eq 0; then
continue
fi
echo $i
done
5.8. 函数
5.8.1. 入门例子
#!/bin/bash
print (){
echo "this is my first function"
}
echo "调用函数print开始"
print
echo "调用函数print结束"
[root@node01 export]# ./exec08.sh
调用函数print开始
this is my first function
调用函数print结束
5.8.2. 函数传参
调用函数时可以向其传递参数;在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
注意:
10
不
能
获
取
第
十
个
参
数
,
获
取
第
十
个
参
数
需
要
10 不能获取第十个参数,获取第十个参数需要
10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
#!/bin/bash
print (){
echo "第一个参数是: $1"
echo "第二个参数是: $2"
echo "第三个参数是: $3"
echo "第四个参数是: $4"
echo "第五个参数是: $5"
echo "第十个参数是: $10"
echo "第十个参数是: ${10}"
}
print 1 2 3 4 5 6 7 8 9 100
[root@node01 export]# ./exec09.sh
第一个参数是: 1
第二个参数是: 2
第三个参数是: 3
第四个参数是: 4
第五个参数是: 5
第十个参数是: 10
第十个参数是: 100
5.8.3. 函数返回值
add (){
return $[ $1 + $2 ]
}
add 1 2
echo $?
5.8.4. 特殊参数说明
特殊参数处理说明:
参数处理 | 说明 |
---|---|
$# | 传递到函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
5.9. 数组
5.9.1. 特点
- bash中的数组只支持一维数组
- 初始化时不需要定义数组大小
- 数组元素的下标由0开始
- 用括号来表示,元素用"空格"符号分割开
5.9.2. 读取数组
使用下标读取数组中某一个元素
#!/bin/bash
arr01=(1 3 "a" "bcd")
echo "数组第一个元素${arr01[0]}"
echo "数组第二个元素${arr01[1]}"
[root@node01 export]# ./exec10.sh
数组第一个元素1
数组第二个元素3
读取数组全部元素
#!/bin/bash
arr01=(1 3 "a" "bcd")
echo "${arr01[*]}"
echo "${arr01[@]}"
[root@node01 export]# ./exec10.sh
1 3 a bcd
1 3 a bcd
读取数组长度
#!/bin/bash
arr01=(1 3 "a" "bcd")
echo "${#arr01[*]}"
[root@node01 export]# ./exec10.sh
4
5.9.3. 修改数组
修改数组第一个元素值为2
#!/bin/bash
arr01=(1 3 "a" "bcd")
arr01[0]=2
echo "${arr01[*]}"
[root@node01 export]# ./exec10.sh
2 3 a bcd
5.9.4. 遍历数组
#!/bin/bash
arr01=(1 3 "a" "bcd")
for i in ${arr01[*]}; do
echo $i
done
[root@node01 export]# ./exec10.sh
1
3
a
bcd
5.10. 引用其它文件变量
在某shell脚本中是可以使用其它脚本中变量,需要先引入其它脚本
引入其它脚本方式
. 其它脚本名称 或者 source 其它脚本名称
脚本exec11.sh:
#!/bin/bash
arr01=(1 2 3 "a" "bcd")
脚本exec12.sh:
#!/bin/bash
source ./exec11.sh
for i in ${arr01[*]}; do
echo $i
done
[root@node01 export]# ./exec12.sh
1
2
3
a
bcd