【001】Linux Shell 学习笔记-Shell基础与变量
1 Shell 基础
1.1 什么是Shell
- shell是一种命令解释器
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 - shell也是一种脚本编程语言
Shell既是一种命令语言,又是一种程序设计语言。
- 脚本: 本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
- 作为命令语言,它交互式地解释和执行用户输入的命令;
- 作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
1.2 Shell的两种执行命令的方式
- 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。
- 批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。
1.3 几种常见的Shell
Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。
查看自己linux系统的默认解析:
当前系统支持的shell
# cat /etc/shells
2 Shell脚本的执行方式
- 脚本中的内容必须以
#!/bin/bash
开头
这句话的意思是告诉执行器需要调用 /bin/bash 来执行这个脚本文件。
这也是在Shell中唯一以 # 号开头却不代表注释的语句,脚本文件中的其他任何地方以 # 号开头的语句都会被认为是注释语句而忽略执行,所以这句话只能写在Shell的开头才有效。
2.1 编写脚本实例
编写一个Shell脚本,输出Hello,World
-
执行命令
vim hello.sh
创建并编辑脚本文件注意:也可以使用其他结尾,但Shell脚本一般以sh结尾
[root@localhost ~]# yum -y install vim
- 脚本中输入以下内容:
#!/bin/bash
echo "Hello,World"
- 方式一:赋予权限,并在脚本文件所在的目录(相对路径)通过 ./ 运行脚本:
[root@localhost ~]# ls
anaconda-ks.cfg hello.sh
[root@localhost ~]# chmod u+x hello.sh
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1201 4月 24 00:17 anaconda-ks.cfg
-rwxr--r--. 1 root root 32 4月 25 11:39 hello.sh
[root@localhost ~]# ./hello.sh
Hello, World
- 方式二:不用赋予脚本文件权限,直接执行:
[root@localhost ~]# chmod u-x hello.sh
[root@localhost ~]# sh hello.sh
Hello, World
3 Shell的变量
3.1 Shell 的变量介绍
Linux Shell中的变量分为系统变量和用户自定义变量,可以通过 set
命令显示所有变量。
常见的系统变量比如: $HOME, $PWD, $SHELL, $USER等等.
3.2 自定义变量
- 基本语法
定义变量:
变量=值
注意:等号左右不能有空格
撤销变量:
unset 变量名
静态变量:readonly
变量=值
注意:静态变量不能被撤销,如果撤销,执行时会报错
2.例子
#!/bin/bash
#定义变量A
A=100
#使用变量需要给变量添加$符号
echo A=$A
echo "A=$A"
#撤销变量A
unset A
echo "A=$A"
#定义静态变量B
readonly B=200
echo "B=$B"
[root@localhost ~]# ./hello.sh
A=100
A=100
A=
B=200
3.变量规则
- 变量名可以由字母、数字、下划线组成,但是不能以数字开头
- 给变量赋值时,等号两侧不能有空格
- 变量名一般习惯大写
- A=
命令
表示运行引号中的命令,并把结果返回给变量A,也可以使用 A=$(命令)
4 设置环境变量
环境变量又叫做全局变量,也就是说在其他的Shell文件中可以直接引用这个变量
- 基本语法
export 变量名=变量值
,功能描述:将Shell变量输出为环境变量/全局变量
source 脚本文件
,功能描述:让修改后的配置信息立即生效
$变量名
,功能描述:获取变量的值
例子
# 在脚本文件hello.sh中定义一个环境变量
export JayChou_HOME=/opt/JayChou
# 刷新脚本文件
source /test/hello.sh
# 查询环境变量的值
echo $JayChou_HOME
# 执行结果
/opt/JayChou
5 位置参数变量
当想要在脚本中获取执行脚本时指定的参数信息就需要使用位置参数变量,比如 sh myshell.sh 100 200
表示执行Shell脚本的同时指定了100、200两个参数,在脚本中使用位置参数变量就可以获取到脚本之外的这两个变量(参数)的值。
- 基本语法
$n
:n为数字,$0代表命令本身,$1 - $9代表第一到第九个参数,第十个及以上的参数需要用大括号包含,如 ${10}
$*
:代表命令行中所有的参数,把所有的参数看成一个整体
$@
:代表命令行中所有的参数,把每个参数区分对待,不再是一个整体
$#
:代表命令行中所有参数的个数
例子
文件
结果
6 预定义变量
预定义变量指的是Shell设计者事先已经定义好的变量,可以直接在Shell脚本中使用这些变量。
- 基本语法
$$
:当前进程的进程号(PID)
$!
:后台运行的最后一个进程的进程号(PID)
$?
:最后一次执行的命令的返回状态
如果这个变量的值为0,证明上一个命令正确执行
如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确
例子
在test.sh文件中编辑内容:
执行结果:
7 运算符
-
通配符:一般应用于文件的外部操作,如ls,rm,cp,find…
*
匹配任意长度的任意字符
?
匹配单个字符
[...]
匹配[]内的任意单个字符,如果首位是!表示取反
[a-z]
任意单个小写字母
[0-9]
任意单个十进制数字
{...}
表示集合
{a,z}
a和z
{a..z}
a到z -
命令连接符
;
连接多条命令,这些命令依次执行
&&
逻辑与,前面的命令正确执行,后面的命令才会执行
||
逻辑或,前面的命令错误执行,后面的命令才会执行
!
非,放在命令的前面,当命令正确执行后会返回错误;当命令错误执行会返回正确 -
引号
`` 中间为命令,表示引用命令的输出结果 $()
’ ’ 强引,原原本本输出引号内的内容
“” 弱引,双引内部的变量或``会被替换掉 -
管道和重定向
|
管道,将前一条命令的标准输出作为后一条命令的输入
>
标准输出重定向
>>
标准输出追加重定向
2>
错误输出重定向
&>
所有输出重定向 1>&2 2>&1
<
输入重定向
<<
输入结束标识符,通常用来创建有内容的文件
<<<
后面的内容将作为标准输入传递给命令 -
算术运算符
+ - * / % ** ^
- 其他特殊符号
#
在脚本里以#开头表示注释
^
行首
$
行尾
&
放在命令的后面表示后台运行
()
()内的命令将在子shell中执行
\
转义符
:
true
/
路径分隔符
_
命名用
.
source, 当前目录
正则表达式
正则表达式是一种字符特征的描述方式,用来在文本中匹配到用户想要的东西.
正则表达式与通配符:
1.正则表达式一般用于处理文本内容,常用命令有grep,sed,awk,vim等
通配符一般用于匹配文件名,常用命令有find,ls,cp等
2.各符号的含义不尽相同.
什么地方使用正则表达式
vim grep sed awk nginx apache mail垃圾邮件过滤。。。 perl java python 等等都使用正则
构成
1.元字符(基本元字符、扩展元字符)
2.除元字符之外的任意字符都是表示他字面意思的正则表达式
正则表达式的匹配过程
正则表达式是按照从表达式最左端第一个字符开始,左到右依次一个一个字符进行匹配.当字符串中有字符成功匹配到正则表达式中字符,则从这个位置开始尝试正则表达式中的下一个字符进行匹配,如果匹配成功则继续从这个位置开始匹配正则表达式中下一个字符;如果匹配不成功,则“回溯”到第一次匹配的字符处重新从正则表达式中第一个字符开始匹配。
特征
贪婪匹配
基本元字符
字符匹配
.
任意单个字符
[]
[]内的任意单个字符
[^]
首位为^表示取反
[a-z]
小写字母
[0-9]
数字
[A-Z]
大写字母
[a-zA-Z]
所有字母
[^a-zA-Z0-9]
所有符号
次数匹配
*
匹配*前面的字符重复0次到多次
\{n\}
匹配前面的字符刚好重复n次
\{n,m\}
前面的字符重复n次到m次
\{,n\}
前面的字符最多重复n次
\{n,\}
前面的字符最少重复n次
位置匹配
^
行首
$
行尾
\<
词首
\>
词尾
扩展元字符 Extended Metacharacters (egrep and awk)
+
前面的字符至少重复1次
?
前面的字符重复0次或1次
|
或
{}
次数匹配
()
分组
\数字
引用分组的内容 1-9
前向: 在正则中引用
后向: 在其他地方引用, \0表示引用模式中所有的内容 \0 ⇔ &
编写正则表达式的3 个步骤:
1 知道要匹配的内容以及它如何出现在文本中
2 编写一个模式来描述要匹配的内容
3 测试它匹配的内容,不能错,不能漏,不能多
POSIX字符类
Reference
1.菜鸟教程
https://www.runoob.com/linux/linux-shell.html
2. Linux Shell脚本详细教程 by zxcodestudy
https://blog.csdn.net/qq_16681169/article/details/78249584
3. Linux中shell简介 by 知行流浪 https://blog.csdn.net/zengxiantao1994/article/details/78077746
4. 课堂笔记
5. Linux之Shell编程详解 by Nice2cu_Code https://blog.csdn.net/weixin_49343190/article/details/120983328