一. Shell是什么?
a)、Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器),它接收用户命令,然后调用相应的应用程序。
b)、Shell还是一个功能相当强大的解释性编程语言,易编写、易调试、灵活性强。
1.语言类型:
1.)编辑型语言
程序在执行之前需要一个专门的编译过程,八程序编译成为机器语言文件,运行是不需要重新翻译,直接使用编译结果就型了。程序执行效率高,依赖编译器,跨平台性差点。如 C ,C++
2.)解释型语言
程序不需要编译,程序运行时由解释器编译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/perI/ruby/Shell等都是解释型语言
3.)Shell解析器:
bash也就是 Bourne Again Shell,由于易用和免费,bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
二、Shell的作用
1.Shell脚本:
若干命令+脚本的基本格式+脚本特定语法+思想= shell脚本,脚本按照顺序执行(由上往下执行),它是解释型的,不需要编译。
使用场景:
重复化、复杂化的工作,可以写成脚本,以后只需要执行脚本就可以完成这些工作
1.)Shell脚本能干啥?
自动化软件部署
自动化分析处理
自动化备份
自动化监控脚本
2.脚本的用法
2.1)脚本的格式:
part1:第一行指定解析器:脚本以#!/bin/bash 或 #!/bin/env bash开头
part2: 第二行开始编写脚本的基本信息描述
part3:脚本的具体代码内容
2.2)运行方式
case1:采用bash或sh + 脚本的相对路径或绝对路径(不用赋予脚本+x权限)
sh/bash 绝对路径|相对路径
source 绝对路径|相对路径
case2:采用输入脚本的绝对路径或相对路径执行脚本(hi奥本必须有可执行权限+x,推荐采用这种方式)
赋予脚本的+x权限 chmod +x 脚本名称 运行:./脚本名称
如果需要在任意地方执行脚本,需要将脚本移动至/bin目录 运行:脚本名称
3.Shell变量
shell的作用:变量是用来临时保存数据的,该数据是可以变化的
什么时候用?
3.1)多次使用,在代码中重复出现,这样在修改内容的时候,仅仅需要修改变量的值。
3.2)代码运作的过程中,后续代码需要使用某些命令的执行结果,可以使用变量保存执行结果。
获取Shell中所有变量命令:set
获取环境变量:env
系统变量:
$HOME、$PWD、$SHELL、$USER
读取变量:echo $变量名
4.自定义变量
4.1)用户变量
定义变量:变量名=值,变量名=`执行命令`,变量名=$(执行命令)
读取变量:echo $变量名
撤销变量:unset 变量名
定义有类型的变量:
给变量做一些限制,固定变量的类型
语法:declare 选项 变量名=变量值
常用选项: -i 将变量看作整数 , -r 创建只读变量
4.2)全局环境变量
关键字:expor
定义变量:export 变量名=值
撤销和读取同
作用域(针对于当前会话下的所有用户有效)
4.3)系统环境变量
编辑配置文件:vim /etc/profile
例如添加系统环境变量 MYNAME=jinghang
变量生效 source /etc/profile
#系统环境变量
export MYNAME=jinghang
经验技巧:
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
4.4)特殊变量
$n 语法:$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$# 语法:$# (功能描述:获取所有输入参数个数,常用于循环)
$* 语法:$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ 语法:$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$? 语法:$? (功能描述:最后一次执行命令的返回状态。如果值为0,命令正确执行;如果值为非0(具体是哪个数,由命令自己来决定),则命令执行不正确)
三.Shell数组
shell定义:Shell 数组用括号来表示,元素用"空格"符号分割开,如果元素中包含空格,则该元素使用双引号引起来,例如"hello word"
语法: 数组名=(value1 value2 value3)
赋值:创建时添加 my_array=(A B "C B" D) 创建后添加 my_array[4]=E
修改:局部:根据索引修改数组 my_array[0]=F
整体:可以直接给数组变量重新赋值
读取:获取数组中所有的元素:echo ${数组名[*]} | echo ${数组名[@]}
根据索引读取数组元素:echo ${数组名[索引值]}
获取数据组的长度:echo ${#数组名[*]} | echo ${#数组名[@]}
删除:unset 关键字来删除数组元素,格式如下:unset array_name[index]不写下标,删除整个数组,格式如下:unset array_name
四.Shell中的运算符
1.整数运算语法:
(1)“$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
(2)expr + , - , *, /, % 加,减,乘,除,取余
2.小数运算:
bc:Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器
在 Shell 脚本中,借助管道或者输入重定向来使用 bc 计算器。
语法:echo "scale=小数位数 ; expression" | bc
案例1:计算3*8/7 结果保留4位小数 echo "scale=4; 3*8/7" | bc
五.Shell条件判断
语法:[ condition ](注意condition前后要有空格)
(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)
六.Shell流程控制
1.)if 判断语句
语法1: if [ 条件判断式 ]
then
主体代码
fi
语法2: if [ 条件判断式 ]
then
主体代码
else
主体代码
fi
语法3: if [ 条件判断式 ]
then
主体代码
elif [条件判断式]
then
主体代码
else
主体代码
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
2.)case 判断语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2)双分号“;;”表示命令序列结束,相当于java中的break。
3)最后的“*)”表示默认模式,相当于java中的default。
3.)for 循环语句
基本语法:
语法一
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
语法二
$*:读取传入脚本中的全部参数,把参数看作一个整体
$@:读取传入脚本中的全部参数,把参数区分对待
for 变量 in "$*"
do
程序
done
for 变量 in "$@"
do
程序
done
4.)while 循环语句
基本语法
while [ 条件判断式 ]
do
程序
done
read读取控制台输入
基本语法:read 【选项】【参数】
功能:-p 指定读取值时的提示符;
-t 指定读取值时等待的时间(秒);
七.Shell函数
1.)系统函数
basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来
语法:basename [string / pathname] [suffix]
可选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
dirname 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
语法:dirname 文件绝对路径
2.)自定义函数
语法:[ function ] funname()
{
Action;
[return int;]
}
funname
经验技巧:
(1)必须在调用函数地方之前,先声明函数,shell脚本逐行运行。不会先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
八.Shell文本处理
1.)cut : 功能描述:cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的,cut指令用户显示行中的指定部分,删除文件中的指定字段。
语法:cut 【选项】【文件】
选项功能:
-b <起始字节位置-结束字节位置> 仅显示行中指定字节范围的内容。例如,“-b 2-10”将显示第2~10个字节位置的内容,当只有一个数字时,则仅显示指定字符位置的内容.
-f <起始列位置-结束列位置> 显示指定的字段内容
-d <分隔符>指定字段的分隔符,默认的字段分隔符为“TAB”
-c <起始字符位置-结束字符位置> 仅显示行中指定范围的字符。例如,“b2-10” 将显示第2~10个字符位置的内容。当只有一个数字时,则仅显示指定字符位置的内容
2.)sort : 功能描述:它将文件进行排序,并将排序结果标准输出
语法:sort 【选项】【参数】
选项功能:
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列
参数:是指待排序的文件
3.)正则表达式:正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
3.1)单字符匹配:
d 匹配一个数字字符。等价于[0-9]
D 匹配一个非数字字符。等价于[^0-9]
w 匹配包括下划线的任何单词字符。类似但不等价于[A-Za-z0-9_]
W 匹配任何非单词字符。等价于 [^A-Za-z0-9_]
s 匹配空白字符,包括空格、制表符、换页符等等,等价于[f
v]
S 匹配任何可见字符。等价于[^ f
v]
.点 匹配除“
”和"
"之外的任何单个字符
[a-z] 字符范围,匹配a~z之间的任意字符
[^a-z] 匹配除了a~z之间的其他字符
匹配换行符
3.2)多字符匹配
+ 匹配前面的子表达式一次或多次(大于等于1次)
* 匹配前面的子表达式任意次
? 匹配前面的子表达式零次或一次
{n} n是一个非负整数。匹配确定的n次
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
3.3)其他
^ 匹配输入字行首
$ 匹配输入行尾
| 将两个匹配条件进行逻辑“或”(or)运算 x|y 匹配x或y
4.)sed: 功能描述:sed是一种单行文本流式编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件结束。文件内容并没有改变,除非你使用重定向存储输出。
语法:sed [选项] ’命令‘ 文件名
选项功能:
-e 直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
-i 直接编辑文件
命令功能
p 打印一般 -n 配合使用
a 新增,在指定的行之后插入内容
i 新增,在指定的行之前插入内容
d 删除
s 查找并替换 (注意:如果进行全局的查找替换 sed -i ‘s/查找条件/替换字符串/g’ global)
5.)awk:功能描述:是一门编程语言,也是一个强大的文本分析工具,逐行扫描文件,默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要的操作。
语法:awk 选项 ‘pattern1{action1} pattern2{action2}...’ 文件名
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令
选项功能:
-F 指定输入文件折分隔符
-v 赋值一个用户定义变量
awk的内置变量:
变量说明:
FILENAME 文件名
NR 已读的记录数
NF 浏览记录的域的个数(切割后,列的个数)