day074 SHELL入门及进阶

SHELL快速入门

学习目标

  1. 了解运维和自动化运维是什么及工作实现方式

  2. 记住shell是什么,说出shell的两分类

  3. 知道shell脚本的特点是什么

运维

运维是什么?

  • 运维是公司的一个技术岗位,负责程序的规划,管理,安全,优化等方面的工作

运维的工作范围

这里写图片描述

以dailyfresh项目为例:

  1. 规划:我们需要多少资源来支持项目的运行
  2. 管理:项目运行过程中的所有内容都要管理起来
  3. 流程规范:所有操作都形成制度,提高工作效率
  4. 平台:大幅度提高工作效率
  5. 监控:实时查看项目运行状态指标
  6. 告警:状态指标异常,告知功能工作人员处理
  7. 安全:网站运营安全措施
  8. 优化:保证用户访问网站的体验很好
  9. 考核:权责分配,保证利益

自动化运维

  • 就是将以上工作以代码化,自动化的方式运行

怎么进行自动化运维呢?

  • 工具,脚本

常见的自动化运维脚本有哪些呢?

  • 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脚本使用方式

    1. 手工方式:直接在终端数据脚本代码,输入完一行,enter键确认,输出结果,再输入下一条指令,依次执行
    1. 脚本文件定义方式:新建一个文件(.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基础知识

学习目标

  1. 掌握shell脚本的标准执行方法
  2. 掌握shell脚本的开发规范和开发小技巧
  3. 说出shell中常用的三种变量及其特点
  4. 应用shell的变量实现特定功能

shell脚本

学习目标

  1. 了解shell脚本的内容小技巧
  2. 掌握shell脚本的标准执行方法
  3. 掌握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、通过缩进让代码易读;(即该有空格的地方就要有空格)

总结

  1. shell脚本命名:有意义,便于知道脚本的目的
  2. shell脚本的注释:单行(#)、多行(:<<字符… 字符)
  3. shell脚本标准执行方法: /bin/bash /path/to/script-name
  4. shell脚本开发规范重点:2-4-5
  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

命令变量

  • 命令变量是指变量的值是一个命令的变量定义方式
  • 定义方式有两种:

    • 变量名=`命令`
    • 变量名=$(命令),推荐使用此形式
  • 执行流程:

      1. 执行命令
      1. 将命令执行后的结果赋值给变量名

示例:

 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 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进阶

学习目标:

  1. 掌握标准测试语句的格式和特点
  2. 掌握常见条件/计算表达式的格式及使用场景
  3. 掌握linux常见符号种类和使用场景
  4. 掌握linux常用命令和使用关键点

表达式

学习目标

  1. 了解常用的两种测试语句
  2. 掌握标准测试语句的格式和特点
  3. 说出常用条件表达式种类
  4. 掌握2种逻辑表达式的特点和使用场景
  5. 掌握3种文件表达式的特点和使用场景
  6. 了解4种数字表达式和2种字符串表达式的特点和使用场景
  7. 应用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常见符号

学习目标:

  1. 掌握两种重定向符号的格式和使用场景
  2. 掌握管道符的特点和使用
  3. 掌握后台展示符号的意义和作用
  4. 掌握信息符号的作用和使用场景

重定向符号

  • 在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
卡住4sleep 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

常见命令详解

本节学习目标:

  1. 掌握grep 命令的格式和常用参数意义和使用场景
  2. 掌握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

猜你喜欢

转载自blog.csdn.net/michael_cool/article/details/80174080