【Linux】Shell概念、命令、操作(重定向、管道、变量)

文章目录

一、概念篇

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系统管理与自动化运维》黑马程序员/编著

相关推荐
知识分享小能手几秒前
Java学习教程,从入门到精通,Java 变量命名规则(12)
java·大数据·开发语言·python·学习·java学习·java后端开发
赶紧回家去2 分钟前
Ansible基本使用
运维·ansible
知识分享小能手2 分钟前
Java学习教程,从入门到精通,Java switch语句语法知识点(14)
java·开发语言·python·学习·javaee·大数据开发·java大数据
Suckerbin5 分钟前
Open SSH服务配置
linux·运维·ssh
雨会停rain5 分钟前
centos部署rabbitmq
linux·centos·rabbitmq
Maynor9966 分钟前
Nginx 迁移到 Caddy:一次完整的反向代理配置迁移实践
运维·nginx
苹果醋312 分钟前
springboot-springboot官方文档架构
java·运维·spring boot·mysql·nginx
Elastic 中国社区官方博客27 分钟前
将你的 Kibana Dev Console 请求导出到 Python 和 JavaScript 代码
大数据·开发语言·前端·javascript·python·elasticsearch·ecmascript
痕忆丶30 分钟前
openharmony北向开发入门教程汇总
开发语言
wrx繁星点点31 分钟前
原型模式:高效的对象克隆解决方案
数据结构·spring·spring cloud·java-ee·maven·intellij-idea·原型模式