前言
也许漫漫长夜里带给你温暖的恰恰是那不会动情亦不会改变的代码。
—–2021年10月29日21:44:06
正文
整体思维导图
Shell 概述
-
shell是一个命令行解释器,接受应用程序/用户命令,然后调用操作系统内核。
-
shell是一门解释性语言,不需要解释器解释就能运行。
-
java是一门编译性语言,需要解释器解释之后才能运行。
脚本入门
须知:
- /bin下的bash就是shell存放的位置。
- 一般脚本文件以sh作为后缀出现。
- 文件头最好加上 #!/bin/bash
运行方式
- bash 文件名
- sh 文件名
- 将文件设置为可执行,然后./文件名
变量
思维导图
系统预定义变量
常用系统变量
H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER等
![image-20211029221017973](https://gitee.com/you-ZP/cloud-images/raw/master/img/image-20211029221017973.png)
自定义变量
语法
定义:变量=值
撤销:unset 变量
声明静态变量:readonly 变量 (!!!注意不能unset)
定义规则
-
名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写.
-
等号两侧不能有空格。
-
在bash中,变量默认类型都是字符串类型。
-
变量的值如果有空格,需要使用双引号或者单引号将该变量括起来。
-
当需要其他shell程序使用该变量时可以把变量提升为全局环境变——export 变量名
特殊变量
$n
功能描述
n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
注意
n用具体的数字表示。
作用是获取第1到n个参数。
在运行脚本的命令后面添加参数,用空格隔开。
示例
1.vim testn.sh —> 输入以下内容
2.bash testn.sh 1 2 3
3.结果为:
$#
功能描述
获取参数个数。
一般用于循环。
示例
在testn.sh中加入
再次运行上一条语句:bash testn.sh 1 2 3
结果为:
$*
功能描述
代表命令行中所有的参数,它把所有的参数看成一个整体。
示例
在testn.sh中加入
再次运行上一条语句:bash testn.sh 1 2 3
结果为:
$@
功能描述
也代表命令行中所有的参数,不过$@把每个参数区别对待。
示例
在文件中加入了
再次运行上一条语句:bash testn.sh 1 2 3
结果为:
以上两个特殊变量在使用循环时使用双引号括起来才会体现不同的效果。
$?
功能描述
获取上一条语句的运行状态(0则运行成功,非0则运行失败)
示例
运算符
基本语法
$((运算式)) 或 $[运算式]
示例
条件判断
基本语法
-
test condition
-
[ condition ] (注意condition前后要有空格)
注意:条件非空即为true,[]返回false。支持多条件判断,通过与或非。
常用判断条件
(1)两个整数之间比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
示例
流程控制
if 判断
基本语法
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
示例
输入一个数字,如果是1,则输出yxpzuishuai,如果是2,则输出lxzzhenmei,如果是其它,什么也不输出。
vim testif.sh –>
bash testif.sh 2
结果为:
bash testif.sh 1
结果为:
case 语句
基本语法
case $变量名 in
值1)
程序1
;;
值2)
程序2
;;
......省略其他分支.....
*)
默认程序
;;
esac
注意事项:
(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“****;;****”表示命令序列结束,相当于java中的break。
(3)最后的“*)”表示默认模式,相当于java中的default。
示例
for循环
基本语法
1.
for ((初始值;循环控制条件;变量变化))
do
程序
done
2.
for 变量 in 值1 值2 值3 ..
do
程序
done
示例
一、
二、
read 读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)、
参数:
变量:指定读取值的变量名
示例
函数
系统函数
basename
基本语法
basename 路径名
作用
显示文件名
示例
dirname
基本语法
dirname 路径名
作用
显示目录路径
示例
自定义函数
基本语法
定义函数
[function] funname[()]{
Action;
[return int;]
}
调用函数
funname
简化定义函数
function funname{
Action;
return int;
}
注意事项
1.必须在调用函数的地方之前,先声明函数,shell脚本是逐行运行,不会像其他语言一样先编译,
。
2.函数返回值只能通过$?系统变量获得,可以显示加:return 返回,如果不加将以最后一条命令运行结果,作为返回值,return后跟数值n(0-255)
示例
计算两个输入参数的和
正则表达式入门
概述
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
在Linux中,grep,sed,awk等命令都支持通过正则表达式进行模式匹配。
常规匹配
一串不包含特殊字符的正则.表达式匹配它自己。例如:cat /etc/passwd | grep yxp
就会匹配所有包含yxp的行
常用特殊字符
字符 | 描述 | 示例 |
---|---|---|
^ | 匹配一行的开头 | ![]() |
$ | 匹配一行的结尾 | ![]() |
. | 匹配一个任意的字符 | ![]() |
* | 不单独使用,他和左边第一个字符连用,表示匹配上一个字符0次或多次 | ![]() |
[] | 表示匹配某个范围内的一个字符 | ![]() |
\ | 表示转义,将转义字符和特殊字符连用,来表示特殊字符本身 | cat /etc/passwd就会匹配所有包含 a$b 的行。 |
Shell工具
cut
概述
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。
cut命令从文件的每一行剪切字节、字符和字段,并将这些字节、字符和字段输出。
基本用法
cut[选项参数] filename
选项参数说明
选项参数 | 功能 |
---|---|
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列(默认分隔符是制表符) |
-c | 指定具体的字符 |
示例
awk
概述
一个强大的文本分析工具,把文件逐行的读入,
以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法
awk[选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern: 表示awk在数据中查找的内容,就是匹配模式
action: 在找到匹配内容时所执行的一系列命令
选项参数说明
选项参数 | 功能 |
---|---|
-F | 指定输入文件的分隔符 |
-v | 赋值一个用户定义变量 |
示例
awk的内置变量
变量 | 说明 |
---|---|
FILENAME | 文件名 |
NR | 已读的记录数(行数) |
NF | 浏览记录的域的个数(切割后,列的个数) |
示例
统计passwd文件名,每行的行号,每行的列数。
sort
概述
sort命令是在Linux'里非常游泳,它将文件进行排序,并将排序结果标准输出。
基本语法
sort(选项)(参数)
选项 | 说明 |
---|---|
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
参数:指定待排序的文件列表
示例
awk的内置变量
变量 | 说明 |
---|---|
FILENAME | 文件名 |
NR | 已读的记录数(行数) |
NF | 浏览记录的域的个数(切割后,列的个数) |
示例
统计passwd文件名,每行的行号,每行的列数。
sort
概述
sort命令是在Linux'里非常游泳,它将文件进行排序,并将排序结果标准输出。
基本语法
sort(选项)(参数)
选项 | 说明 |
---|---|
-n | 依照数值的大小排序 |
-r | 以相反的顺序来排序 |
-t | 设置排序时所用的分隔字符 |
-k | 指定需要排序的列 |
参数:指定待排序的文件列表
示例
结言
无聊的时候居然自觉地开始学习了,奇怪,我咋啦?
–2021年10月30日14:55:30