文章目录
一、概念篇
1、shell的概念
Shell是一种具备特殊功能的程序,处于用户与内核之间提供用户与内核进行交互的接口。Shell可以接收用户输入的命令,将命令送入内核中执行。
Shell也是一个解释型的程序设计语言,使用Shell语言编写的程序称为Shell脚本。
2、shell的分类
LInux中shell种类很多,但常用的有sh、bash、csh/tcsh、ksh、zsh。
- 查看主机支持的shell类型:
c
cat /etc/shells
可知,我的主机支持sh、bash两种。
- 查看当前使用的shell(具体命令作用在命令篇讲解):
c
echo $SHELL
由此可见,本机当前使用的是bash,即系统默认的shell。
- 更改用户使用的shell
直接输对应shell的文件名即可。以sh为例:
c
/bin/sh
这时在用echo $SHELL查看,发现还是bash,这是因为sh是在bash之后启动的,是bash的子shell,echo $SHELL只能显示用户登录的shell,不能显示其子shell,这时,就要用ps命令
二、命令篇
1、cat
查看文件内容
c
cat 文件 #查看文件内容
cat -n 文件 #把文件的行号也打印出来
c
cat /var/log/messages #查看日志
相关命令:
c
tac 文件 #反向打印文件内容
tac /var/log/messages #反向查看日志
more 文件 #支持下翻逐行查看
less 文件 #支持上下翻查看文件
/字符串 :搜索关键字(字符串)
q 退出
2、echo
格式:
c
echo 字符
将其后面的内容按字符串打印在显示器上。与C语言中的printf类似,但echo自带换行符,而printf需自己添加换行符。
echo后面的内容用"引用",或用'引用',效果几乎一样。屏蔽符号。
故而,我们可以理解这段命令:echo $SHELL ,将 $SHELL的结果,作为字符串打印在显示器上。
SHELL为环境变量。
3、ps
查看当前系统中,正在运行的进程。
故而,此图显示了,运行的进程有 bash、sh
4、grep
文本过滤,搜索并打印含有关键字符的匹配行。
从一个或多个文件中搜索与指定模式匹配的文本行。
格式:
c
grep [选项] [模式] [文件名]
模式:匹配模式
文件名:用于指定搜索目标,文件名可以有多个,中间用空格分开。
选项:
c
-n #输出所有匹配的文本行,并显示行号
-c #只输出匹配行的数量,不显示匹配内容
4.1、匹配行首
元字符"^"表示匹配行首。
例,查找文件/etc/sysctl.conf 中以"#"开头的文本行,并显示其行号。
c
grep -n ^# sysctl.conf
"^"还可以结合"$",搜索文件中的空白行。
例,搜索文件/etc/yum.conf中的空白行与非空白行
c
grep -c ^$ yum.conf #搜索空白行
grep -c ^[^$] yum.conf #非空白行
4.2、大小写
例,在文件/etc/yum.conf中,搜索this/This关键字
1、-i 选项
c
grep -in this yum.conf
2、[ ]符号
c
grep -n [Tt]his yum.conf #不区分t的大小写
c
grep -n '[Tt][Hh][Ii][Ss]' yum.conf #不区分this的大小写
3、转义字符
如果匹配的目标中包含元字符,则需利用转义字符"\"屏蔽它们。
"-"是grep命令中的选项特殊字符,以"-"开头时,也要用转义字符。
5、sed
非交互式文本处理命令,可对文本文件和标准输入进行编辑。与vi等文本编译器相比,sed可一次性处理所有的编译任务。
格式:
1、
bash
sed [选项] 'sed编辑命令' 输入文件
选项:
现有一文本文件text.txt,文件内容为:
2、
bash
sed '=' 文件 #使用=选项,带行号输出文本
以上述文件为例:
bash
sed '=' text.txt #带行号输出text.txt文件
3、
bash
sed '指定地址a\追加内容' 输入文件 # a\追加文本
将指定的一行或多行文本追加到指定位置。
bash
sed '/For rain/a\add a new line!!!' text.txt #在text.txt文件中的For rain 后面追加新内容"add a new line!!!"
编写一个脚本add.sh,脚本内容为:
4、用脚本完成追加
方法1:
bash
sed -f add.sh text.txt # -f编辑脚本内容,只是对输出结果进行了追加,未改变原来的文件和脚本
方法2:
将add.sh中加入#!/usr/bin/sed -f (#! 解释器路径 -f)解释器路径可用which命令查看。
将add.sh变为可执行文件
bash
chmod u+x add.sh
执行脚本
三、操作篇
1、自动补全
shell提供自动补全功能,按一次Tab补全,两次列出所有匹配项。
2、查看历史命令
- history命令
- 键盘上下键,可逐条查看命令行历史记录
3、命令替换
命令替换有两种方式:反引号` (esc下面的按键) 和$()
作用:将命令字符替换为命令的执行结果。
例:
c
ls 命令的作用是显示当前文件路径下的文件名
那么,它的执行结果就是:当前文件路径下的文件名,即为`ls`
这时我们将其与echo联用
此时,两个命令作用相同。
使用$()也是一样:
4、重定向
shell默认接收用户输入到终端的命令,在执行后打印错误信息和输出结果。
标准输入文件标识符 0
标准输出文件标识符 1
标准错误文件标识符 2
4.1、输入重定向
c
命令 0<文件名/路径 #0可被省略
#以下这段命令为例
wc -l < /usr/share/hwdata/oui.txt
wc -l 作用:统计文件中的行数
将/usr/share/hwdata/oui.txt中的内容,作为wc命令的输入,即统计/usr/share/hwdata/oui.txt文本中的行数。
4.2、输出重定向
c
命令 1>文件名/路径 #1可被省略
#以下这段命令为例
cat 文件1 > 文件2
将文件1中的内容以覆盖的形式打印到文件2中,若想保留文件2的内容,可用>>,将文件1中的内容追加到文件2中。
(cat:打印文件内容)
4.3、错误重定向
c
命令 2>文件名/路径 #2不可被省略
将错误信息重定向到文件中。
也可用>>,将错误信息追加到文件中。
5、管道
符号"|",可将多个简单命令连接起来,使一个命令的输出,作为另一个命令的输入 。
格式:
c
命令1 | 命令2 | 命令3
以ls命令和grep命令为例:
c
ls -l /etc | grep init #搜索并打印/etc目录下,包含关键字符init的行
将ls -l /etc 的输出(/etc目录下的文件),作为grep的输入,即在/etc目录下的文件中搜索包含init的行。
6、shell中的变量
shell提供了一些变量,这些变量可以保存路径名、文件名或数值等,shell中常用的变量有四种:本地变量、环境变量、位置变量、特殊变量。
6.1、本地变量
相当于C语言中的局部变量,只在本shell中有效,退出本shell后将被销毁。
如果变量未被指定,将被赋值为空字符串。在使用变量时,要在变量前加上"$"符号。
还可以连续输出多个变量
使用read命令,作用和(scanf/gets)相似。
从标准输入中读取变量值。
c
-p #设置输入提示信息
c
read -p "please input an int number:" ADD
删除变量(unset)
c
echo $ADD
unset ADD #删除本地变量ADD
echo $ADD
6.2、环境变量
环境变量一般用来存储路径列表。用export定义的环境变量只在本shell和其子shell中有效,shell重启后将丢失。
格式:
c
export 变量名=变量值
export是环境变量的关键字,用于声明该变量为环境变量。
例
c
export APP=/usr/local
查看所有环境变量(env)
c
env
unset 变量名
删除环境变量(unset)
6.3、位置变量
用于接收传入shell脚本的参数,故位置变量也称为位置参数。
格式:
c
$n #用于接收传递给shell脚本的第n个参数
6.4、特殊变量
用来查看脚本的运行信息。
常用特殊变量:
bash
$# 传递脚本的参数数量
$* 和$@ 传递到脚本的所有参数
$? 命令退出状态,0正常退出,非0异常退出
$$ 表示进程的PID
7、shell中的符号
7.1、单引号
可将它中间的字符还原成字面意义,屏蔽shell元字符。
例,
bash
'$NUM' #NUM为本地变量。
bash
NUM=100
echo $NUM
echo '$NUM'
7.2、双引号
具有屏蔽功能,但不会屏蔽$、\、``符号
例,
bash
NUM=100
echo $NUM
echo "$NUM"
7.3、反引号
进行命令替换
例,
bash
date #显示系统时间
echo "Today is `date`"
7.4、通配符
bash
* #与0个或多个字符匹配
? #与任何单个字符匹配
[] #与[]中的任一字符匹配
[!] #与[]外的任一字符匹配
1、*
例,列出/etc目录下的以sys开头的所有文件,
bash
ls -d /etc/sys* #-d选项,只对目标目录本身处理,不做递归处理。
匹配以sys开头的所有文件。
2、?
每次只能匹配一个字符。
例,查找/etc目录下文件名是由两个字符组成的文件
bash
ls -d /etc/??
ls -d ?? #在/etc路径下
3、[]
表示与[]中任一字符匹配,通常是一个范围。
例,在/etc目录下,列出以f~h开头,以.conf结尾的文件
bash
ls /etc/[f-h]*.conf
4、[!]
表示除了[]里面的字符,与其它任一字符匹配。
例,查找以y开头,不以.conf结尾的文件
bash
ls -d /etc/y*[!conf]
四、谢谢观看!
参考书籍:《LInux系统管理与自动化运维》黑马程序员/编著