SHELL快速入门
学习目标
了解运维和自动化运维是什么及工作实现方式
记住shell是什么,说出shell的两分类
知道shell脚本的特点是什么
运维
运维是什么?
运维是公司的一个技术岗位,负责程序的规划,管理,安全,优化等方面的工作
运维的工作范围
以dailyfresh项目为例:
规划:我们需要多少资源来支持项目的运行管理:项目运行过程中的所有内容都要管理起来流程规范:所有操作都形成制度,提高工作效率平台:大幅度提高工作效率监控:实时查看项目运行状态指标告警:状态指标异常,告知功能工作人员处理安全:网站运营安全措施优化:保证用户访问网站的体验很好考核:权责分配,保证利益
自动化运维
就是将以上工作以代码化,自动化的方式运行
怎么进行自动化运维呢?
工具,脚本
常见的自动化运维脚本有哪些呢?
shell脚本和其他语言的开发脚本shell脚本就是shell编程的一种具体实现
SHELL简介
shell是什么?
shell是命令解释器shell出于系统和应用之间,负责将应用程序的命令解释给系统,也负责将系统的命令执行的结果解释给应用程序,在计算机中,是应用程序与系统之间交流的桥梁。
shell的分类
shell分为图形界面shell和命令行shell
图形界面shell就是桌面命令行shell为:windows:cmd.exe;linux系统:sh/csh/ksh/bash…
查看当前系统的shell类型:
echo $SHELL
查看当前系统环境支持的shell:
cat /etc/shells
shell脚本
shell脚本使用方式
手工方式:直接在终端数据脚本代码,输入完一行,enter键确认,输出结果,再输入下一条指令,依次执行
脚本文件定义方式:新建一个文件(.sh),在文件中输入想要执行的所有代码,保存后,执行这个文件即可示例: vim 01_first_shell_script.sh
01_first_shell_script.sh
echo "hello"
echo "world"
脚本执行效果:
/bin/bash
01_first_shell_script
.sh
hello
woeld
总结
shell是命令解释器shell分为图形界面shell和命令行shellshell是可执行命令的组合
SHELL基础知识
学习目标
掌握shell脚本的标准执行方法掌握shell脚本的开发规范和开发小技巧说出shell中常用的三种变量及其特点应用shell的变量实现特定功能
shell脚本
学习目标
了解shell脚本的内容小技巧掌握shell脚本的标准执行方法掌握shell脚本的开发规范和开发小技巧
创建脚本
创建工具:vi/Vim脚本命名:有意义脚本内容:各种可执行的命令注释内容:
单行注释:# 后面跟的就是单行注释 多行注释::<
#!/bin/bash
echo "这是普通的shell脚本命令"
:<<!这是多行
注释!
:<<a这是第二种多行
注释的方式a
~
执行脚本文件
/bin/bash
02_zhshi.sh
这是普通的
shell脚本命令
脚本执行
shell的执行方式
bash /path/
to/
script-
name 或/bin/bash /path/
to/
script-
name (强烈推荐使用)
/path/
to/
script-
name 或./
script-
name (当前路径下执行脚本)
source
script-
name 或.
script-
name (注意“.“点号)
脚本开发规范
1、脚本命名要有意义,文件后缀是.sh
2、脚本文件首行是而且必须是脚本解释器
#!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容
脚本文件中尽量不用中文注释;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
1)成对内容的一次性写出来,防止遗漏。
如:()、{}、[]、
''、``、
""
2)[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
3)流程控制语句一次性书写完,再添加内容
7、通过缩进让代码易读;(即该有空格的地方就要有空格)
总结
shell脚本命名:有意义,便于知道脚本的目的shell脚本的注释:单行(#)、多行(:<<字符… 字符)shell脚本标准执行方法: /bin/bash /path/to/script-nameshell脚本开发规范重点:2-4-5shell脚本开发小技巧:6-7
变量
学习目标
1、说出变量的定义和目的 2、掌握本地变量的查看格式和使用场景 3、掌握全局变量的查看/定义格式和使用场景 4、掌握普通变量的标准查看方法 5、说出shell内置变量的特性和分类 6、掌握shell内置变量的使用场景
什么是变量
变量包括两个部分
变量名:不变的变量值:变化的
我们一般说的变量,指的是变量名
在shell中,变量分为三类:
本地变量全局变量内置变量
本地变量
本地变量是什么?
本地变量就是在某个环境下才能生成的变量,作用范围小本地变量包含两种:
普通变量命令变量
普通变量
定义方式
方式一:
变量名=变量值
重点:
变量值必须是一个整体,中间没有特殊字符
方式二:
变量名='变量值'
重点:
我看到的内容,我就输出什么内容
方式三:
变量名=
"变量值"
重点:
如果变量值范围内,有可以解析的变量
A,那么首先解析变量
A,将
A的结果和其他内容组合成一个整体,重
新赋值给变量B
习惯:
**数字不加引号,其他默认加双引号**
示例:
echo $var
var=
666
echo $var
var=
'666'
echo $var
var=
"666"
echo $var
var=
666 aaa
var=
'666 aaa'
echo $var
var=
"666 aaa"
echo $var
var1=bbb
echo $var1
var2=
'$var $var1'
echo $var2
var2=
"$var $var1"
echo $var2
命令变量
命令变量是指变量的值是一个命令的变量定义方式
定义方式有两种:
变量名=`命令`变量名=$(命令),推荐使用此形式
执行流程:
执行命令
将命令执行后的结果赋值给变量名
示例:
a=$(
echo "this is a test")
echo $a
a=`
echo "this is a test"`
echo $a
全局变量
全局变量是什么?
在当前系统环境下都能生效的变量
env 只显示全局变量
定义全局变量
方法一:
变量=值
export 变量
方法二:(最常用)
export 变量=值
示例:
env
export
A=
1121
env | grep
A=
1121
变量查看和取消
查看变量
方式一:
$变量名
场景:
私下里,在命令行/脚本中使用
图省事
方式二:
"$变量名"
场景:
私下里,在命令行/脚本中使用
图省事
方式三:
${变量名}
场景:
echo " dsa dsafsa dsafsa ${变量名} f "
使用频率较高
方式四:
"${变量名}"
场景:
标准使用方式
取消变量
unset 变量名
示例:
“` a=1121 export A=1121 env | grep A=1121 env | grep a=1121
echo “
A”echo“
A
”
e
c
h
o
“
{a}”
“`
shell内置变量
我们之前学习的本地变量,全局变量都是需要通过定义,然后才能实现相应功能的,那么有没有一些变量我们可以直 接拿过来使用实现某种具体的功能呢?有,这就是shell内置变量
和脚本文件有关
符号意义
$0 获取当前执行的shell脚本文件名
$n 获取当前执行的shell脚本的第n个参数值,n=
1..
9,当n为
0时表示脚本的文件名,如果n大于
9就要用大
括号括起来
${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(
0为成功,非
0为失败)
示例:
#!/bin/bash
echo "当前文件名称: get_name.sh"
echo "当前文件名称: $0"
#!/bin/bash
echo "第 1 个位置的参数内容是: $1"
echo "第 2 个位置的参数内容是: $2"
echo "第 4 个位置的参数内容是: $4"
echo "第 3 个位置的参数内容是: $3"
#!/bin/bash
echo "当前脚本传入的参数总个数是: $#"
字符串精确截取
格式:${变量名:起始位置:截取长度}
如:
$
{file:0:5} 从第1个字符开始,截取5个字符
$
{file:5:5} 从第6个字符开始,截取5个字符
$
{file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
示例:
a=
"abcdefg"
b=
${a:0:6}
echo $b
b=
${a:1:6}
echo $b
b=
${a:0-3:6}
echo $b
默认值相关
场景1:
变量a如果有内容,那么就输出a的变量值 变量a如果没有内容,那么就输出默认的内容
格式:${变量名:-默认值}
示例: - 如果我输入的参数为空,那么输出内容是”您选择的套餐是: 套餐1” 如果我输入的参数为n,那么输出内容是”您选择的套餐是: 套餐n”
#!/bin/bash
a=
$1
echo "您选择的套餐是是${a:-1}"
场景二:
无论变量a是否有内容,都输出默认值格式:${变量名+默认值}
示例: 不管我说国家法定结婚年龄是多少岁,都输出国家法定结婚年龄(男性)是22 岁
#!/bin/bsh
b=
$2
echo "法定结婚年龄为:${b+22}"
总结:
变量: 变量值+变量名
shell三种变量: 本地+全局+内置
本地变量种类:
普通变量定义格式
: 变量值
'变量值' "变量值"
命令变量定义格式
: `命令`
$(命令)
命令变量:
专用查看命令:env
标准定义格式:export 变量名=变量值
普通变量查看方法:
$变量名
"$变量名" ${变量名}
"${变量名}"
变量取消专用命令:unset
shell内置变量三种类:
文件相关:
$0 $n $# $?
字符串相关
: ${变量名
:起始位置
:截取长度}
默认值相关
: ${变量名
:-默认值}
${变量名+默认值}
SHELL进阶
学习目标:
掌握标准测试语句的格式和特点掌握常见条件/计算表达式的格式及使用场景掌握linux常见符号种类和使用场景掌握linux常用命令和使用关键点
表达式
学习目标
了解常用的两种测试语句掌握标准测试语句的格式和特点说出常用条件表达式种类掌握2种逻辑表达式的特点和使用场景掌握3种文件表达式的特点和使用场景了解4种数字表达式和2种字符串表达式的特点和使用场景应用2种计算表达式
测试语句
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败使用专门的测试工具—test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值0为成立)测试语句形式
A: test 条件表达式B: [ 条件表达式 ],推荐使用格式注意: 以上两种方法的作用完全一样,后者为常用。 但后者需要注意方括号[、]与条件表达式之间至少有一个空格。 test跟[] 的意思一样 条件成立,状态返回值是0 条件不成立,状态返回值是1
条件表达式
我们这部分内容主要是介绍,测试语句中的[ 条件表达式] 这一部分,测试的结果使用echo $? 来查看
逻辑表达式
逻辑表达式一般用于判断多个条件之间的依赖关系。常见的逻辑表达式有: && 和||
&&
命令1 && 命令2如果命令1执行成功,那么我才执行命令2 如果命令1执行失败,那么命令2也不执行– 夫唱妇随
||
命令1 || 命令2如果命令1执行成功,那么命令2不执行 如果命令1执行失败,那么命令2执行– 对着干
示例:
[
1=
1 ] &&
echo "&&ok"
[
1=
2 ] &&
echo "$$nook"
[
1=
1 ] ||
echo "||ok"
[
1=
2 ] ||
echo "||nook"
&&ok
16057nook
文件表达式
-f 判断后面的内容是否是一个文件-d 判断后面的内容是否是一个目录-x 判断后面的内容是否是一个可执行文件
示例:
#!/bin/bash
[
-f 06_file_exp.sh ] &&
echo "ok"
[
-d 06_file_exp.sh ] ||
echo "不是一个目录"
[ -x
06_file_exp.sh ] &&
echo "是一个可执行文件"
ok
不是一个目录
数值操作符
主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。常见选项如下:
n1 -eq n2 相等n1 -gt n2 大于n1 -lt n2 小于n1 -ne n2 不等于
示例:
#!/bin/bash
[
1 -eq 1 ] &&
echo '相等'
[
1 -lt 2 ] &&
echo '小于'
[
2 -gt 1 ] &&
echo '大于'
[
2 -ne 1 ] &&
echo '不等于'
相等
小于
大于
不等于
字符换比较
str1 == str2 str1和str2字符串内容一致str1 != str2 str1和str2字符串内容不一致
示例:
#!/bin/bash
[
'michael'==
'michel' ] &&
echo '相等'
[
'michael'!=
'jackson' ] &&
echo '不相等'
相等
不相等
计算表达式
计算表达式,简单来说就是对具体的内容进行算数计算格式:
方式一:
(())
(
(
)
)
(( 计算表达式)),推荐使用方式二: let let 计算表达式注意: $(())中只能用+-*/和()运算符,并且只能做整数运算
示例:
echo $((
100/
5))
20
i=
1
let i=i+
1
echo $i
2
总结:
标准的测试语句:[ 条件表达式 ]四种条件表达式:
逻辑: &&(同林鸟) ||(对着干)文件: -f -d -x数字: -ge -gt -lt -ne字符串: == !=两种计算表达式:$((计算表达式)) let 变量名a=变量名a+1
linux常见符号
学习目标:
掌握两种重定向符号的格式和使用场景掌握管道符的特点和使用掌握后台展示符号的意义和作用掌握信息符号的作用和使用场景
重定向符号
在shell脚本中有两种常见的重定向符号> 和>>
> 表示将符号左侧的内容,以覆盖的方式输入到右侧文件中>> 表示将符号左侧的内容,以换行添加的方式追加到右侧的文件中
示例
echo 'michael' > test.sh
cat test.sh
michael
echo 'jackson' > test.sh
cat test.sh
jackson
echo 'jackson' >> test.sh
cat test.sh
jackson
jackson
管道符号
|,用来将|左边的信息传递到|右边的工具使用格式:命令1 | 命令2
管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用
示例:
env | grep SHELL
SHELL=
/bin/bash
其他符号
后台展示符号&
就是将一个命令从前台转到后台执行格式:命令 &
示例:
sleep 4
卡住
4秒
sleep 10 &
后台运行,不耽误其他操作
全部信息符号2>&1
符号详解:
1 表示正确输出的信息2 表示错误输出的信息2>&1 代表所有输出的信息
示例:
bash
10_output_msg
.sh 1 > zhengque
cat zhengque
bash
10_output_msg
.sh 2 > cuowu
cat cuowu
bash
10_output_msg
.sh > all_msg
2>&
1
cat all_msg
linux系统垃圾桶
/dev/null 是linux下的一个设备文件,这个文件类似于一个垃圾桶,特点是:容量无限大
示例:
rm zehngque > /dev/null
本节内容小结:
重定向符号:
>(覆盖) >>(追加)管道符:
信息传递, 从左到右其他符号:
后台展示符号: &信息提取符号: 2>&1垃圾桶符号: /dev/null
常见命令详解
本节学习目标:
掌握grep 命令的格式和常用参数意义和使用场景掌握sed 命令的格式和常用参数意义和使用场景
grep 命令详解
定义
grep命令是我们常用的一个强大的文本搜索命令
命令格式
命令格式:grep [参数] [关键字] <文件名>
注意:我们在查看某个文件的内容的时候,是需要有<文件名> grep命令在结合|(管道符)使用的情况下,后面的<文件名>是没有的 可以通过grep –help 查看grep的帮助信息
参数解释
参数详解
-c:只输出匹配行的计数。-n:显示匹配行及行号。-v:显示不包含匹配文本的所有行。
示例: 模板文件:
find.txt
nihao aaa
nihao AAA
NiHao bbb
nihao CCC
-c :输出匹配到aaa的个数
grep -c aaa find.txt
1
-n: 输出匹配内容,同时显示行号
grep -n
CCC find.txt
4:nihao CCC
-v:匹配到的内容部输出,输出不匹配的内容
grep -v ni find.txt
NiHao bbb
sed 命令详解
定义
seds是行文件编辑工具。因为它编辑文件是以行为单位的.
命令格式
sed [参数] ‘<匹配条件> [动作]’ [文件名]
参数解释
参数为空表示sed的操作效果,实际上不对文件进行编辑-i 表示对文件进行编辑注意:mac版本的bash中使用-i参数,必须在后面单独加个东西: -i ”
匹配条件
匹配条件分为两种:数字行号或者关键字匹配关键字匹配格式: ‘/关键字/’
注意: 隔离符号/ 可以更换成@、#、!等符号 根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可。
动作详解
-a 在匹配到的内容下一行增加内容-i 在匹配到的内容上一行增加内容-d 删除匹配到的内容-s 替换匹配到的内容注意: 上面的动作应该在参数为-i的时候使用,不然的话不会有效果
替换命令演示
关于替换,我们从三个方面来学习: 行号、列号、全体命令格式: sed -i [替换格式] [文件名]注意:替换命令的写法
’s###’ —> ‘s#原内容##’ —> ‘s#原内容#替换后内容#’样式一: sed -i ‘行号s#原内容#替换后内容#列号’ [文件名]样式二: sed -i ‘s#原内容#替换后内容#g’ [文件名]
示例:
模板文件
sed_test.txt
nihao sed sed sed
nihao sed sed sed
nihao sed sed sed
替换每行首个匹配内容:
sed -i ‘s#原内容#替换后内容#’ 文件名
替换首每行的第1个sed为SED
sed -i '' s#sed#SED# sed_test.txt
nihao SED sed sed
nihao SED sed sed
nihao SED sed sed
替换全部匹配内容
sed -i ‘s#原内容#替换后内容#g’ 文件名
替换全部sed为des
sed -i '' s#sed#des#g sed_test.txt
nihao des des des
nihao des des des
nihao des des des
指定行号替换首个匹配内容
sed -i ” 行号s#原内容#替换后的内容# 文件名
替换第2行的首个SED为sed
sed -i '' 2s#SED#sed# sed_test.txt
nihao SED SED SED
nihao sed SED SED
nihao SED SED SED
首行指定列号替换匹配内容
sed -i ‘s#原内容#替换后内容#列号’ 文件名
替换每行的第2个SED为sed
sed -i '' s#SED#sed#2 sed_test.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed SED
指定行号列号匹配内容
sed -i ‘行号s#原内容#替换后内容#列号’ 文件名
替换第3行的第2个SED为sed
sed -i '' 3s#SED#sed#2 sed_text.txt
nihao SED sed SED
nihao sed SED sed
nihao SED sed sed
增加操作
在指定行号的下一行增加内容
格式:
sed -i ‘行号a\增加的内容’ 文件名如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如 sed -i ‘1,3a\增加内容’ 文件名
示例: 在第二行下增加一行内容“insert-2”
sed -
i '2a\zengjia-2' sed_text.txt
cat sed.txt
nihao SED sed SED
nihao sed SED
zengjia-
2
nihao SED sed sed
指定1~3每行都增加内容
sed -
i '1,3a\tongshi-2' sed_text.txt
cat sed_text.txt
nihao SED sed SED
tongshi-
2
nihao sed SED sed
tongshi-
2
zengjia-
2
tongshi-
2
nihao SED sed sed
在指定行号的当行增加内容
格式:
sed -i ‘行号i\增加的内容’ 文件名注意: 如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如 sed -i ‘1,3i\增加内容’ 文件名
示例:在第一行插入一行内容
sed -
i '1i\insert-1' sed_text.txt
cat sed_text.txt
insert-
1
nihao SED sed SED
tongshi-
2
nihao sed SED sed
tongshi-
2
zengjia-
2
tongshi-
2
nihao SED sed sed
删除操作
指定行号删除格式:
sed -i ‘行号d’ 文件名注意: 如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如 sed -i ‘1,3d’ 文件名
示例:删除第5行的内容
sed -
i '5d' sed_text.txt
cat sed_text.txt
insert-
1
nihao SED sed SED
tongshi-
2
tongshi-
2
zengjia-
2
tongshi-
2
nihao SED sed sed
删除第3-5行内容
sed -
i '3,5d' sed.txt
cat sed.txt
insert-
1
nihao SED sed SED
tongshi-
2
nihao SED sed sed