![dabb652fc897a27ff967301638a391ca.png](https://i-blog.csdnimg.cn/blog_migrate/6d9184b48e3c6f51f598c9bc5774a4f3.jpeg)
一. SHELL入门
1.1 变量
1.1.1 变量名规范
- 变量是由任何字母、数字、下划线组成的字符串,且不能以数字开头。
- 区分字母大小写
- 变量、等号、值中间不能出现任何空格
实例
![4fcce10e515dfd66a67ecf252b3580b4.png](https://i-blog.csdnimg.cn/blog_migrate/142e2071ad0f240910ccbc4ea860d268.png)
1.1.2 位置变量
当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数。
位置参数变量 | 描述 |
---|---|
$n | n 为数字,$0 代表Shell本身的文件名,$1〜$9 代表第 1~9 个参数,10 以上的参数需要用大括号包含, 如${10} |
$* | 命令行所有参数,把所有的参数看成一个整体 |
$@ | 命令行中所有参数,但每个参数区别对待 |
$# | 命令行中所有参数的个数 |
实例
![cda3061703723af1a42e021e3b508fce.png](https://i-blog.csdnimg.cn/blog_migrate/c135814938ab5d16bc3fff5a13810e23.png)
1.1.3 环境变量
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或多个应用程序将使用到的信息。Linux是一个多用户的操作系统,每个用户登录系统时都会有一个专用的运行环境,通常情况下每个用户的默认的环境都是相同的。这个默认环境就是一组环境变量的定义。每个用户都可以通过修改环境变量的方式对自己的运行环境进行配置。
分类
- 对所有用户生效的环境变量 /etc/profile
- 对特定用户生效的环境变量 ~/.bashrc或者~/.bash_profile
- 临时有效的环境变量 export
常用环境变量
环境变量 | 含义 |
---|---|
PATH | 命令搜索的路径 |
HOME | 用户家目录的路径 |
LOGNAME | 用户登录名 |
PWD | 当前所在路径 |
HISTFILE | 历史命令的保存文件 |
HISTSIZE | 历史命令保存的最大行数 |
HOSTNAME | 主机名 |
SHELL | 用户当前使用的SHELL |
PS1 | 一级命令提示符 |
TMOUT | 用户和系统交互过程的超时值 |
IFS | 系统输入分隔符 |
OFS | 系统输出分隔符 |
实例
![a7586a09e9ef323e61b418bc053f1361.png](https://i-blog.csdnimg.cn/blog_migrate/ab4c4dd8277e3126bd5f8346ed783414.png)
1.2 管道
将一个命令的输出作为另一个命令的输入
实例
- 列出所有安装过的软件包
rpm -qa
rpm命令是RPM软件包的管理工具
- 列出与python相关的软件包
| grep python
Linux grep 命令用于查找文件里符合条件的字符串。
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :打印匹配次数
-f 两个文件相同行 如,grep -f file1 file2
-h 不显示匹配行所在文件名
-i :忽略大小写的不同,所以大小写视为相同
-l 只显示匹配到的文件名
-n :顺便输出行号
-o 只显示匹配的字符
-v :只显示不匹配的行。
--color
- 显示与python相关的软件包的行数
| grep python
1.3 退出状态码
1.3.1 退出状态码描述
所有的shell命令都使用退出状态吗来告知shell它已执行完毕
退出状态码是一个0~255的整数值
Linux提供了一个$?来捕获退出状态码的值,所以,可以通过echo语句测试命令是否运行成功。
一般来讲,退出状态 0 表示正常执行,没有遭遇任何问题。其他非零的状态码均表示失败。
状态码 | 描述 |
---|---|
0 | 命令成功结束 |
1 | 一般性未知错误 |
2 | 不适合的shell 命令 |
126 | 找到了该命令但无法执行 |
127 | 没找到命令 |
128 | 无效的退出参数 |
128+x | 与linux信号x相关的严重错误 |
130 | 通过ctrl+C终止的命令 |
255 | 正常范围之外的退出状态码 |
实例
![cf4ba1c3adeed329d10f9bf3f64cae44.png](https://i-blog.csdnimg.cn/blog_migrate/341cdcfab373eb48cb2c386fdc2ab43f.png)
1.3.2 改变退出状态码的exit命令
退出状态码是以上一条指令的返回结果为准
使用exit命令改变退出状态码
exit
二. 判断与控制
2.1 if-then 语句
语法:
if
实例
#!/bin/bash
![6b8578bf533e11acad8259e7cb4359a2.png](https://i-blog.csdnimg.cn/blog_migrate/4104d3b9185ca2da588737d2ec1edd19.png)
2.2 if-then-else 语句
语法:
if
实例
#!/bin/bash
2.3 嵌套if语句
语法:
if
2.4 条件测试-数值比较
语法:
if condition
或者
if condition
数值比较
数值比较 | 含义 |
---|---|
n1 -eq n2 | n1和n2相等,则返回true;否则返回false |
n1 -ne n2 | n1和n2不相等,则返回true;否则返回false |
n1 -gt n2 | n1大于n2,则返回true;否则返回false |
n1 -ge n2 | n1大于等于n2,则返回true;否则返回false |
n1 -lt n2 | n1小于n2,则返回true;否则返回false |
n1 -le n2 | n1小于等于n2,则返回true;否则返回false |
实例
#!/bin/bash
![56506760dcb06b52296f23c64a47b8b3.png](https://i-blog.csdnimg.cn/blog_migrate/c5475c444c72c2e3a18bd067f67210c1.png)
2.5 条件测试-字符串比较
字符串比较
字符串比较 | 含义 |
---|---|
str1 = str2 | 相等比较 |
str1 != str2 | 不相等比较 |
str1 < str2 | str1小于str2为true |
str1 > str2 | str1大于str2为true |
-n str1 | str1长度不是0则为true |
-z str1 | str1长度是0则为true |
实例
#!/bin/bash
![2f7e4e4bf9377876043e20eea5952f53.png](https://i-blog.csdnimg.cn/blog_migrate/92939451db52989cebe10c83453d7abb.png)
#!/bin/bash
![5d198f3db303c60db3e4c9bc4ecd86de.png](https://i-blog.csdnimg.cn/blog_migrate/767eda0c7149a2381c269422eed34b07.png)
#!/bin/bash
![d53ac5837c798e50408f325c014af82c.png](https://i-blog.csdnimg.cn/blog_migrate/df57962d8ddea5abeaa1af234b777b3b.png)
#!/bin/bash
![bcac4941f2767ce6dc5900995d50b1c6.png](https://i-blog.csdnimg.cn/blog_migrate/da178286ec3bd09ddfdf62d74df788c3.png)
2.6 条件测试-文件比较
文件比较
文件比较 | 含义 |
---|---|
-d file | file是否为目录 |
-f file | file是否为文件 |
-e file | file是否存在 |
-r file | file是否可读 |
-w file | file是否可写 |
-x file | file是否可执行 |
-s file | file存在且非空 |
file1 -nt file2 | file1比file2新为true |
file1 -ot file2 | file1比file2旧为true |
实例
#!/bin/bash
![b96f97e64709aecfd0f9ed0f3cad096e.png](https://i-blog.csdnimg.cn/blog_migrate/3ae3ed4bf3bb10c250a58ddb26619d0a.png)
#!/bin/bash
![1fded8f4abdfa779559c2cc9207fb5d7.png](https://i-blog.csdnimg.cn/blog_migrate/e4a33dbd78e3e1ea3c0476b772d65195.png)
2.7 符合条件测试
语法:
if condition1
实例
#!/bin/bash
![745a8936296fff30aae9cb121a8f374f.png](https://i-blog.csdnimg.cn/blog_migrate/f04334745af24f03d70be7bb4db4b3e2.png)
2.8 if-then中使用双括号
使用双括号进行算术运算
语法:
if
注:
- 双括号结构中,变量名引用可以加$,也可以不加
- 运算符前后可以有空格,也可以没有
- 可以用于if,for,while等循环控制结构中
- 多个运算符使用逗号分隔
可用运算符
运算符 | 含义 |
---|---|
value++ | 后增 |
value-- | 后减 |
++value | 先增 |
--value | 先减 |
! | 逻辑求反 |
== | 相等 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
&& | 逻辑与 |
|| | 逻辑或 |
实例
#!/bin/bash
![5e0959aa578244ab3e7521480d769d67.png](https://i-blog.csdnimg.cn/blog_migrate/8dd8b3009d1f148b8855bef418bace77.png)
2.9 if-then中使用双方括号
单方括号语法
if
改为双方括号语法
if
注:
- 双括号结构中,变量名引用必须加$
- [[后面必须要空格,]]前面必须有空格
2.10 case命令
语法:
case
实例:
#!/bin/bash
![afdcb33fb452eec1a609e17f979fd25b.png](https://i-blog.csdnimg.cn/blog_migrate/bae7de796eea1f97d028855c4214ea84.png)
三. 循环与控制
3.1 for循环
循环遍历一系列特定值,然后在结构体中针对每个特定值做处理
语法:
for var in list
实例:
for循环读取列表值:
#!/bin/bash
![b2cb71e3034d1b44ca519d49b4d1d723.png](https://i-blog.csdnimg.cn/blog_migrate/65d34bc4aa1087810f7185ee7a57f325.png)
for循环读取变量值:
#!/bin/bash
![afb9b0955456ee618caa981f91325a91.png](https://i-blog.csdnimg.cn/blog_migrate/203d5401a3ae72fe44811f84f1da419e.png)
#!/bin/bash
![a7bdcc088ecc7ecaa89ffb6b5e134978.png](https://i-blog.csdnimg.cn/blog_migrate/c72b86ca745e877b65e46396a984f824.png)
for循环从命令执行结果读取值
#!/bin/bash
![fec3a10b2090647457cc3a3cb1f92d95.png](https://i-blog.csdnimg.cn/blog_migrate/8ce360047119b8cb4d5ac8d83a5f5e6c.png)
#!/bin/bash
![9254ba8f31c77316a1432715419ddcbe.png](https://i-blog.csdnimg.cn/blog_migrate/539d0ae2f2534838f93a5c0afbf43576.png)
C语言风格的for循环
#!/bin/bash
![7652ab840eb7d8b12a74291ca908d604.png](https://i-blog.csdnimg.cn/blog_migrate/ce9807d5a59740e74a44991ae7f20e30.png)
#!/bin/bash
![4ade57db2daa7354cd7a8ccfee876de4.png](https://i-blog.csdnimg.cn/blog_migrate/c4d0e1033ab53e886d58a5476148d8db.png)
3.2 while循环
语法:
while
实例:
#!/bin/bash
![8bcdc091228cab82d6ddca4ac3c8f5d9.png](https://i-blog.csdnimg.cn/blog_migrate/6d2956fbc538a7eadaa77e94a5054d1f.png)
3.3 until命令
语法:
until
实例:
#!/bin/bash
![9d2b18ad958b53e1faa635fa265c705e.png](https://i-blog.csdnimg.cn/blog_migrate/2499af78e205a92014c30171c6151f40.png)
3.4 break命令
实例:
#!/bin/bash
![a1db15a281a037ab9cd3379ab21dcc14.png](https://i-blog.csdnimg.cn/blog_migrate/e6f0a64c6432d2d32f8b5751612edcf9.png)
当有两层循环的时候,"break 1"跳出内循环; " break 2"跳出外循环
#!/bin/bash
![6e841d674577b6612a013f2fb6a4e2e2.png](https://i-blog.csdnimg.cn/blog_migrate/e1018cb212659d1eff1cb14c0a802769.png)
#!/bin/bash
![00b35a3b4c6c09a16966efda056a3aa7.png](https://i-blog.csdnimg.cn/blog_migrate/479cbfccc60ac2d84100a32aa17b0904.png)
3.5 continue命令
实例:
#!/bin/bash
![ce81640464f202e775523e83d90ccd04.png](https://i-blog.csdnimg.cn/blog_migrate/879f078ea322862dd5d3056ece4a55f1.png)
3.6 处理循环的输出
实例
#!/bin/bash
![ce9c67b0156a9ec326249aeb10c18ef1.png](https://i-blog.csdnimg.cn/blog_migrate/ce398baafd0beb793eff530373ed04c9.png)
#!/bin/bash
![211ccdbd43e0f56dc4c870f36b729885.png](https://i-blog.csdnimg.cn/blog_migrate/015772f6c89a47d8f9bc3fd58f371098.png)