Linux自动化运维工程师--(3)shell脚本的基础知识与shell脚本中的变量

Linux自动化运维工程师

实验所用系统为Redhat-rhel8.2。


实验环境:
一台配置好网络软件仓库和IP的虚拟机

Linux自动化运维工程师–shell脚本的基础知识

一、什么是shell

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

二、shell脚本的意义

1.记录命令执行的过程和执行逻辑,以便以后重复执行
2.脚本可以批量处理主机
3.脚本可以定时处理主机

三、如何创建shell脚本

在创建shell脚本时,通常会新建以.sh或.script结尾的文件。创建脚本后第一步要写入幻数#!/bin/bash,它是脚本运行时最先执行的指令,通常都是脚本中其他指令的运行环境,也可以是#!/bin/sh
除了要写入运行环境外,其他的信息也应该写入,比如脚本的运行人,建立时间,邮件,版本等,这些信息写入脚本中,是为了使打开脚本的用户知道该脚本的信息,称之为首部信息。
但是如果每次都需要手写首部信息的话,是十分耗时且低效率的,所以可以通过对vim的设定使其自动出现。在vim的主配置文件/etc/vimrc中设定,此文件是全局配置文件,对所有用户生效。如果需要只针对某一用户生效,比如超级用户,则在用户家目录中编辑.vimrc文件也可以控制vim的运行,但只针对当前用户生效,即在子配置文件~/.vimrc中编辑首部信息。
请添加图片描述

[注意] 编辑此文件,则只对root用户生效,对其他用户不生效。

请添加图片描述

set nu				##显示行号
ts=2				##指定tab键为2个空格
et					##把tab键转换成空格
ai					##自动缩进
func				##函数类型标志
endfunc				##函数结束标志
call				##调用
append				##添加语句
0					##在第一行添加,所添加的内容要用 “ ” 引起来
.					##隔开多个内容
strftime			##自动识别捕捉时间并以年/月/日格式输出显示

调用函数有两种方式:

autocmd BufNewFile *.sh,*.script call WESTOSTITLE()		
##autocmd设定当新建以.sh或.script结尾的文件时自动调用函数WESTOSTITLE
"map <F4> ms:call WESTOSTITLE()<cr>'s	
##map设定按键调用函数,其中’s是固定格式,此时创建脚本后按设定的按键()即可调用自动添加脚本首部信息的函数WESTOSTITLE()

请添加图片描述

四、如何执行shell脚本

ps f		##查看运行环境

1、直接在当前环境中运行shell中的指令,不开启新的shell

source script.sh	
. script.sh
##两种方式相同

请添加图片描述

2、手动在环境中开启指定解释器

sh script.sh		##用指定shell运行脚本中的命令

请添加图片描述

3、开启脚本中指定的shell并使用此shell环境运行脚本中的指令

先给脚本文件执行权限,然后文件可以直接被执行。

chmod +x script.sh
/xxx/xxx/script.sh		##此时必须输入绝对路径
./script.sh

请添加图片描述

五、如何对脚本进行调试

编写脚本内容如下,模拟脚本卡住的情况,当执行脚本时,脚本卡住,此时无法判断脚本时因为什么原因被卡住。
请添加图片描述
请添加图片描述

当需要确定卡住的原因时,可以在执行脚本时加入-x参数。

sh -x /mnt/westos.sh

+		##运行的指令
不带+	##命令运行的输出

请添加图片描述

  • 练习1:编写脚本ip_show.sh,执行时后加网卡名称,执行结果应显示当前网卡的IP。

  • 思路解析:首先判定执行脚本时是否加网卡名称,没有则报错退出,有则判定该网卡是否存在,没有则退出,有则显示其ip。先使用ifconfig ens3命令观察输出。ip在inet后,即inet为第一列,ip为第二列,抓取inet,其前后都没有字符,输出第二列。
    请添加图片描述
    请添加图片描述

  • 练习2:编写脚本host_messages.sh,显示当前主机的名称,ip以及登录当前主机的用户。
    hostname: xxxxx
    ipaddress: xxxx.xxxx.xxx.xxx
    username: root

  • 思路解析:当前主机名称使用hostname命令查询,ip则使用上一题的解法,登录当前主机的用户可以使用whoami命令查询。同时需要显示各自的名称,则可以使用echo命令加上\t转义tab,中间使用\n换行符隔开,-e表示多条策略的执行。
    请添加图片描述
    请添加图片描述
    请添加图片描述

  • 练习3:编写脚本clear_log.sh,执行此脚本后可以清空日志。

  • 思路解析:首先,清空日志需要在超级用户下,所以先检测当前用户,不是超级用户则退出,如果时超级用户,则判定日志文件是否存在,不存在则报错退出,存在则清空日志。
    请添加图片描述
    请添加图片描述

Linux自动化运维工程师–shell脚本中的变量

一、变量的定义

变量的本质是内存一片区域的地址,因为命令无法操作一直变化的目标,所以变量存在的意义就是用固定的字符串表示不固定的值。
变量是用于跟踪几乎所有类型信息的简单工具。变量声明后没有赋值的话,编译器会自动提示并赋予默认值。变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息。
使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值。

二、shell脚本中变量的定义方法

1、变量的级别

可以使用env命令查看系统中所有变量的信息。

1)环境级别的变量

环境级别的变量值不会影响另一个环境中的变量。
请添加图片描述

[注意] 因为执行脚本时新打开了一个shell,最开始对变量a的赋值是在当前的shell里

想要所有子程序环境下的变量a的值都为1,需要添加声明,给当前shell中的所有子程序环境传递变量值,此时运行a.sh脚本可以看到变量a的值。

export a=1			##变量a的声明语句

请添加图片描述

[注意] 但此时的变量依旧为环境变量,在环境关闭后变量失效。因为当shell关闭后,所有资源被系统回收,再打开新的shell时没有任何配置指定变量a的值。

请添加图片描述

2)用户级别的变量

但如果不想要变量随环境改变而改变或者消失,可以设定针对某用户永远生效的shell,在用户环境变量配置文件~/.bash_profile中编辑export声明变量a的值为1,source使设定生效。

vim ~/.bash_profile			##用户环境变量配置文件
///
export a=1
///
source ~/.bash_profile		##生效当前的更改信息

请添加图片描述
请添加图片描述

[注意] 此设定只针对被设定过的用户生效,当切换用户后,变量失效。因为切换用户后开启shell读取的是自己家目录中的.bash_profile

请添加图片描述

3)系统级别的变量

如果需要整个系统都使用变量a的值为1,可以编辑系统级别环境变量配置主文件/etc/profile,但不推荐使用,一般情况下设定系统级别环境变量自定义子配置文件/etc/profile.d/westos.sh,声明变量a的值为1,source使设定生效。

vim /etc/profile					##系统级别环境变量配置主文件(不推荐使用)
vim /etc/profile.d/westos.sh		##系统级别环境变量自定义子配置文件
///
export a=1
///
source /etc/profile.d/westos.sh		##使设定生效

请添加图片描述

[注意] 此时的设定针对所有用户,系统中所有用户都可以使用,即切换用户之后变量a的值依旧为1。

请添加图片描述

4)命令执行检索路径的的设定

[注意] 当命令在/bin/里可以直接执行,但如果在/mnt里,必须通过绝对路径来执行,是因为系统中环境变量PATH没有指定执行命令检索路径当中包含/mnt,但可以编写环境变量配置文件来设定在执行命令时/mnt中的脚本可以使用相对路径来调用。

请添加图片描述
请添加图片描述

2、变量的名称

变量的名称设定只能包含三种字符:字母,下划线和数字,并且不能以数字开头。
请添加图片描述
建议变量名称全用大写字母,使用_区分子类。
请添加图片描述

三、变量的转译

1、转译

\		#转译单个字符
""		#弱引用,批量转译个数字符 不能转译"\ " "" "$" "!"
''		#强引用

请添加图片描述请添加图片描述
请添加图片描述
请添加图片描述

2、声明

当显示一个变量和一个字符串时,系统会将其整体识别为一个变量,此时要对变量进行声明。
请添加图片描述

3、变量的数组

假设a为一个数组,a=(1 2 3 4 5)。

a$[a[@]:起始元素id:元素个数]
echo ${a[0]}		##数组中第一个元素
echo ${a[1]}		##数组中第二个元素
echo ${a[*]}		##数组中所有元素,所有内容为一个整体
echo ${a[@]}		##数组中所有元素,每个元素都各自为一个整体
echo ${a[@]:0:3}	##数组中从第一个元素开始显示三个元素
echo ${#a[@]}		##数组中元素的个数

unset a[n]			##删除数组中的第n+1个元素
unset a				##删除a这个数组

请添加图片描述
请添加图片描述

4、Linux中命令的别名设定

在系统中有很多命令拥有更简便的别名,比如ls -l的别名为ll,命令的别名可以使用alias命令查看。
请添加图片描述

1)临时设定

命令的别名也可以设定。设定xieru为vim的别名,则输入xieru命令,打开vim。但此时的设定为临时设定,当退出用户重进之后该设定会消失。

alias xieru='vim'		##临时设定

请添加图片描述
请添加图片描述
请添加图片描述

2)用户级别设定

需要该别名设定不受环境控制,则可以编辑用户级shell配置文件~/.bashrc,设定该用户永久使用该别名。

vim ~/.bashrc		##用户级shell配置文件
///
alias xieru='vim'		##只针对该用户生效
///
source ~/.bashrc	##使设定生效
alias				##查看

请添加图片描述
请添加图片描述

[注意] 此时的别名设定为用户级,当切换到其他用户时,设定失效。

请添加图片描述

3)系统级别设定

需要系统中所有用户都可以使用该别名,则编辑/etc/bashrc

vim /etc/bashrc		##针对系统所有用户生效
///
alias xie='vim'
///
source /etc/bashrc 

请添加图片描述
请添加图片描述

4)删除别名设定

将配置文件/etc/bashrc~/.bashrc中的设定删掉,使用unalias命令删除别名。
请添加图片描述

5、变量的定义方式

1)数值定义
export a=1
2)使用命令的输出指定变量的值
TIME=`date`
TIME=$(date)

请添加图片描述

3)脚本中的传参
  1. 非交互式传参:
    编写一个脚本,用来解释脚本中参数的意义。
    请添加图片描述
    请添加图片描述
  2. 交互式传参
read  WESTOS					##对westos赋值
read -p "please input word:"	##输出提示语 
-s								##隐藏输入内容

编写一个脚本,用来交互式传参。-p参数表示显示提示语句,WORD表示变量。
请添加图片描述
请添加图片描述
也可以对参数进行加密,需要加-s参数。
请添加图片描述
请添加图片描述

  • 练习:编写一个脚本create_user.sh,后加username,检测该用户是否存在,如果存在,则输出用户存在,如果用户不存在,则建立用户,并且提示输入用户密码,然后设定用户密码。
  • 思路解析:首先检测执行脚本时是否加了要创建的用户,如果没有,报错退出。然后检测该用户是否已经存在,如果已存在,则报错退出。如果不存在则检测当前用户是否为超级用户,如果不是则退出,如果是则建立该用户并且设定该用户的密码,注意密码无回显,建立成功后显示用户已经建立,退出脚本。
    请添加图片描述
    请添加图片描述

6、脚本函数

脚本函数就是程序的别名。可以使脚本中重复的部分剥离,也可以使脚本循环。
编写一个脚本,定义函数ECHO()为date命令和显示其后所跟的内容,再写入其后跟的内容,保存退出。执行该脚本,则得到日期和脚本中写入的$1。
请添加图片描述
请添加图片描述
如果在函数执行结束后又写入该函数,则可以使函数重复执行,使脚本循环。
请添加图片描述
请添加图片描述

  • 练习:编写脚本check_file.sh,提示输入文件名称,检测文件类型,如果是目录,则输出是目录,如果是文件,则检测是否存在。如果不存在循环执行,直至输入exit退出。
  • 思路解析:首先判定文件是否存在,不存在则重新输入,然后判定类型,并且循环,直至输入exit。使用嵌套,函数File_Type()调用函数Check_File(),在Check_File()函数中写入要判定的内容,函数File_Type()则是判定过程。
    请添加图片描述
    请添加图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值