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
#/bin/bash
# 这是脚本示例文件
echo "hello"
echo "world"
脚本执行效果:
/bin/bash 01_first_shell_script.sh
hello
woeld
总结
- shell是命令解释器
- shell分为图形界面shell和命令行shell
- shell是可执行命令的组合
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-name
- shell脚本开发规范重点:2-4-5
- shell脚本开发小技巧: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
# 获取当前脚本文件名 $0
echo "当前文件名称: get_name.sh"
echo "当前文件名称: $0"
#!/bin/bash
# 获取第 n 个位置的内容 $n
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, -d, -x
# -f 判断是否为一个文件
[ -f 06_file_exp.sh ] && echo "ok"
# -d 判断是否为一个目录
[ -d 06_file_exp.sh ] || echo "不是一个目录"
# -x 判断是否为一个可执行文件
[ -x 06_file_exp.sh ] && echo "是一个可执行文件"
ok
不是一个目录
数值操作符
- 主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于、小于、等于第二个数。
- 常见选项如下:
- n1 -eq n2 相等
- n1 -gt n2 大于
- n1 -lt n2 小于
- n1 -ne n2 不等于
示例:
#!/bin/bash
# 测试数字比较操作符:-eq;-lt;-gt;-ne
[ 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
# 测试字符串之间的比较:str1==str2,str1!=str2
[ '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