Linux

文章目录

1. 目录结构

Linux的目录结构是一个树型结构
Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘
Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面

目录作用
/bin二进制命令所在的目录
/boot系统引导程序所需要的文件目录
/dev设备软件目录,磁盘,光驱,
/etc系统配置,启动程序
/home普通用户的家,目录默认数据存放目录
/lib共享库文件和内核模块存放目录
/mnt临时挂载储存设备的挂载点
/opt额外的应用软件包
/proc操作系统运行时,进程信息和内核信息存放在这里
/rootLinux超级权限用户root的家目录
/sbin和管理系统相关的命令,【超级管理员用】
/tmp临时文件目录,这个目录被当作回收站使用
/usr用户或系统软件应用程序目录
/var存放系统日志的目录

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. 文件权限说明

文件 / 目录 的权限包括:

序号权限英文缩写数字序号
01readr4
02writew2
03执行executex1
04无权限-0

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

用于切换用户,普通用户不能使用某些权限, 所以需要切换用户。

序号命令作用说明
01su - 用户名切换用户, 并且企划目录- 可以切换到用户家目录, 否则保持位置不变
02exit退出当前登录用户
[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 1113 11:57 anaconda-ks.cfg
-rw-r--r--. 1 root root 1544 1113 12:04 initial-setup-ks.cfg
drwxr-xr-x. 2 root root    6 1115 16:17 test
-rw-r--r--. 1 root root    4 1115 17:10 test01.data
drwxr-xr-x. 3 root root   16 1115 16:19 test02
-rw-r--r--. 1 root root   16 1115 20:23 test02.data
lrwxrwxrwx. 1 root root   11 1115 21:06 test03.data -> test02.data
drwxr-xr-x. 2 root root    6 1113 14:14 公共
drwxr-xr-x. 2 root root    6 1113 14:14 模板
drwxr-xr-x. 2 root root    6 1113 14:14 视频
drwxr-xr-x. 2 root root    6 1113 14:14 图片
drwxr-xr-x. 2 root root    6 1113 14:14 文档
drwxr-xr-x. 2 root root    6 1113 14:14 下载
drwxr-xr-x. 2 root root    6 1113 14:14 音乐
drwxr-xr-x. 2 root root    6 1113 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编辑器三种模式:

  1. 命令模式

- 打开文件首先进入命令模式, 是使用vi的入口

- 通过 命令 对文件进行常规的编辑操作, 例如 定位 翻页 复制 粘贴 删除

- 在其他图形编辑器下, 通过 快捷键 或者 鼠标 实现的操作, 都在 命令模式 下实现

  1. 末行模式 – 执行 保存 退出等操作

- 要退出 vi 返回到控制台, 需要在莫行模式下输入命令

- 末行模式 是 vi 的出口

  1. 编辑模式 – 正常的编辑文字

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个字符

参数说明:

参数英文含义
-ccharacters按字符选取内容
[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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值