Shell编程规范与变量

引言

在一些复杂的Linux 维护工作中,大量重复性的输入和交互操作不但费时费力,而且容易出错,而编写一个恰到好处的 Shell脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担。

一、Shell脚本概述

1、什么是Shell

  • Linux系统中运行的一种特殊程序
  • 在用户和内核之间之间充当“翻译官”
  • 用户登陆Linux系统时,自动加载一个Shell程序
  • Bash是Linux系统中默认使用的Shell程序

用户与内核进行交互过程如下:

  1. 计算机接收用户所输入的的命令
  2. shell会将所接收到的命令转换成计算机所能识别的二进制语言
  3. 再将命令传递给系统内核执行

2、Shell的作用

Linux系统中的shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"翻译官"的角色,负责接收用户输入的操作指令命令并进行解释,将需要执行的操作传递给内核调动硬件执行,并输出执行结果。

在这里插入图片描述
内核:用于调用计算机硬件资源
shell:将用户指令转换成计算机语言让内核去调用计算机硬件资源
bash是一个文件,linux系统中万物皆文件
bash文件位于/bin/bash

用户的登录Shell

  • 登录后默认使用的Shell程序,一般为/bin/bash
  • 不同Shell的内部指令、运行环境等会有所区别
    在这里插入图片描述
    注:
  • nologin:是奇怪的shell,这个shell可以让用户无法登录主机。
  • bash ( /bin/bash)是目前大多数Linux版本采用的默认shell。

3、Shell脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种Shell控制语句以完成更复杂的操作

2.1 shell脚本是什么

shell脚本就是说我们把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本

总结:将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的

2.2 shell脚本能干什么

  • 自动化完成软件的安装部署,如安装部署LAMP架构服务
  • 自动化完成系统的管理,如批量添加用户
  • 自动化完成备份,如数据库定时备份
  • 自动化的分析处理,如网站访问量

4、Shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

二、Shell编程规范

1、创建Shell 程序的步骤

  1. 创建一个包含命令和控制结构的文件。
  2. 编辑完之后修改这个文件的权限使它可以执行 #使用chmod +x 文件名
  3. 检测语法错误(命令集合是否正确) #set -x 追踪脚本是否有故障
  4. 执行脚本./text.sh

2、Shell脚本的构成

2.1 编写脚本代码

  • 使用vim文本编辑器
  • 每行一条Linux命令,按执行顺序依次编写
vim [文件名].sh

2.2 赋予可执行权限

  • 使脚本具有可执行属性
chmod +x text.sh

2.3 脚本的构成

  • 第一行为“#!/bin/bash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。
  • 还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
  • 注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
  • 可执行语句:如echo命令,用于输出“ ”之间的字符串
    在这里插入图片描述

3、执行脚本的方法

3.1 脚本文件路径(绝对路径与相对路径)

必须有执行(x)权限

以根目录下的text.sh为例:

./text.sh    #相对路径
/root/text.sh  #绝对路径

先给text.sh添加执行权限
在这里插入图片描述
相对路径
在这里插入图片描述
绝对路径
在这里插入图片描述

3.2 sh 脚本文件路径

不需要x权限
在这里插入图片描述

3.3 source脚本文件路径

  • source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令
  • 不需要x权限,也需要使用相对路径或绝对路径
    在这里插入图片描述

3.4 其他方法

sh < text.sh 
或者 
cat text.sh |sh(bash)
或者
bash text.sh

在这里插入图片描述

三、重定向与管道操作

1、交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

在这里插入图片描述

2、重定向操作

在这里插入图片描述

2.1 重定向操作

1、往里添加内容
在这里插入图片描述
2、cat 命令会接受标准输入设备(键盘)的输入,并显示到控制台

cat <<0
//以0作为分界符,只要不输入0就会一直输入数据从而显示到屏

cat << 0 > a.txt    
//可以把输入重定向和输出重定向结合使用,把从屏幕输出的内容保存到文件

在这里插入图片描述

2.2 错误重定向

错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符

作用:

  • 在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据
  • 还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁

使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,
若要追加内容而不是覆盖文件,则应改用“2>>”操作符

当命令输出的结果可能既包括标准输出(正常执行)信息,又包括错误输出信息时,可以使用操作符“>”“2>”将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类信息输出信息保存到同一个文件

/dev/null:把它看作"黑洞",所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然 而 /dev/null 对命令行和脚本都非常的有用
echo kgc > /dev/null
cat /dev/null #什么信息也看不到

&>和>&符号
&表示等同于的意思
例1:把正确和错误的消息输入到相同的位置
1>&2 把标准输出重定向到标准错误
2>&1 把标准错误重定向到标准输出,

cat /tmp error.txt >a.txt 2>&1   #查看erro.txt,把正确和错误的信息都放进a.txt
或:
cat /tmp error.txt 2>b.txt 1>&2   

1、将错误显示的内容和正确显示的内容分开
在这里插入图片描述
2、把正确的和错误的信息都保存到一个文件(混合模式)
在这里插入图片描述
3、另一种方法,把正确的和错误的信息都保存到一个文件(混合模式),
在这里插入图片描述

3、管道操作

管道(pipe)操作为不同命令之间的协同工作提供了一种机制,位于管道符号“|”左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。

在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息。

  • $bash 表 示 系 统 提 示 符 , 表示系统提示符, 表示此用户为普通用户,超级用户的提示符是#
  • bash是shell的一种,是linux下最常用的一种shell
  • $bash的意思是执行一个子shell,此子shell为bash。
grep "^zhangsan" /etc/passwd | awk -F: '{print $1,$7}'
#打印出/etc/passwd下张三开头的

awk -F: '{print $1,$7}以冒号:分隔,输出第1和第7个字段,其中-F部分用来指定分隔符号

1、打印出/etc/passwd下张三开头的,并只显示第1和第7个字段
在这里插入图片描述

2、打印出用户中可以登录shell的用户,并且只显示第1、6、7行,同一行命令中可以使用多个管道
在这里插入图片描述
3、过滤出以根结尾的行
在这里插入图片描述

四、Shell变量的作用、类型

1、变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义
  • 变量值:能够根据用户设置、系统环境的变化而变化

2、变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 特殊变量:环境变量、只读变量、位置变量、预定义变量

3、自定义变量

变量名=变量值      #变量名以字母或下划线开头,区分大小写,建议全大写
 
echo $变量名      #查看变量的值

等号(=)用来给变量赋值

等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值
在这里插入图片描述
在这里插入图片描述

3.1 引用变量

echo选项

  • echo-n表示不换行输出
  • 使用echo -e输出转义字符,将转义后的内容输出到屏幕上
  • 常用的转义字符如下:
    \c不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo-n
    \n 换行
    \t 转义后表示插入tab,即制表符

:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\s将输出“$”符号,而不当做是变量引用

在这里插入图片描述

3.2 赋值时使用引号

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值, $视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果,​​``​​​和$(…)作用相同

1、双引号允许通过$符号引用其他变量值
在这里插入图片描述
2、单引号禁止引用其他变量值, $视为普通字符
在这里插入图片描述
3、查找useradd的位置并列出其详细属性

ls -lh `which useradd`
#相当于连续执行两条命令,先通过which useradd命令查找出useradd命令的程序位置,然后根据查找结果列出文件属性

在这里插入图片描述
4、查询提供useradd命令程序的软件包所安装的配置文件的位置(从里到外先后执行替换)
在这里插入图片描述
5、查看当前日期
在这里插入图片描述

3.3 交互式定义变量(read)

read命令获取输入内容

-p:提示用户的信息
 
-n:定义字符数
 
-s:不显示用户输入的内容,常用于输入密码read -s -p "input your password:" pass
 
-t:定义超时时间,超过多长时间没输自动退出从文件读取内容赋值给变量(默认10s)    


stty -echo  //关闭屏幕回显
stty echo   //开启屏幕回显

1、从文本读取内容赋值给变量

read -p 提示信息 变量名
echo $变量名

在这里插入图片描述

在这里插入图片描述
2、在脚本中编写,在命令行实现read获取
在这里插入图片描述
在这里插入图片描述

3.4 设置变量的作用范围(export)

格式1:export 变量名
格式2:export 变量名=变量值

默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或者新的子Shell环境时,局部变量将无法再使用。

例如:直接执行Bash进入下一个新的子Shell脚本后,将无法引用父级Shell环境中定义的变量
在这里插入图片描述
为了使用用户定义的变量在所有的子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令Export将指定的变量到处为全局变量。可以同时指定多个变量名称作为参数(不需要使用$符号),变量名之间以空格分隔。
在这里插入图片描述
使用export导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值。
例如:执行以下操作可以直接新建一个名为lc的全局变量
在这里插入图片描述

3.5 数值变量的运算

Shell变量的数值运算多用于脚本程序的过程控制。在Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下所示。需要注意的是,运算符与变量之间必须有至少一个空格。

  • 运算内容:加(+)、减(-)、乘(*)、除(/)、取余(%)
  • 运算符号: ( ( ) ) 和 (( ))和 (())[]
  • 运算命令: expr和let
  • 运算工具: bc(计算器)

常用的几种运算符
在这里插入图片描述

3.5.1 expr命令

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。

整数变量的运算

expr 变量1 运算符 变量2 [运算符 变量3]...

常量运算
在这里插入图片描述
变量运算

在这里插入图片描述
使用脚本执行
在这里插入图片描述
在这里插入图片描述

3.5.2 let命令

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

let n++        #n自加1
let n--        #n自减1
 
[n++]      #先输出后执行
[++n]      #先执行后输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.5.2 bc命令

bc 命令是任意精度计算器语言,通常在linux下当计算器用。

直接使用bc会进入交互界面
在这里插入图片描述
可以用echo结合管道使用命令
scale=4 设小数位,4 代表保留四位:
sqrt表示开平方根
在这里插入图片描述

bc 除了 scale 来设定小数位之外,还有 ibase 和 obase 来其它进制的运算

进制转换
在这里插入图片描述
在这里插入图片描述

五、特殊的Shell变量

1、环境变量

  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件:/etc/profile(全局配置文件)~/.bash_profile(用户的独立配置文件)

常用的环境变量
在这里插入图片描述
在这里插入图片描述

已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行 。
例如:text.sh脚本位于/root目录下,若希望能直接通过文件名称来运行脚本,可以修改PATH变量以添加搜索路径,或者将text.txt脚本复制到现有搜索路径中的某个文件夹下。
在这里插入图片描述
在Linux系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。除此之外,每个用户还有自己的独立配置文件(~/.bash_profile)。若要长期变更或设置某个环境变量,应在上述文件中进行设置。
例如,执行以下操作可以将记录的历史命令条数改为200条,只针对root用户。
在这里插入图片描述
上述修改只有当root用户下次登录时才会生效。若希望立即生效,应手动修改环境变量,或者可以加载配置文件执行。
在这里插入图片描述

2、只读变量

用于变量值不允许被修改的情况

readonly 命令设置只读变量
readonly PRODUCT        #设置为只读变量
echo $PRODUCT
PRODUCT=Python              #只读变量不可以被重新赋值
unset PRODUCT         #只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决

在这里插入图片描述

3、位置变量

当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。

$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}

例1:编写一个创建用户的脚本,通过位置变量来实现
在这里插入图片描述
在这里插入图片描述
例2:编写一个加法运算的脚本,用来计算两个整数的和。
在这里插入图片描述

4、预定义变量

预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用*$"符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。

$#:  表示命令行中位置参数的个数。
 
$*:  表示所有位置参数的内容,这些内容当做一个整体
 
$@: 表示列出所有位置参数,但是是以单个的形式的列出
 
$?: 表示前一条命令执行后的返回状态,返回值为О表示执行正确,返回任何非О值均表示执行出现异常。
 
$0:表示当前执行的脚本或程序的名称
 
$$:表示返回当前进程的进程号
 
$ !:返回最后一个后合进程的进程号

1、编写一个备份操作的脚本,用来打包命令行指定多个文件或目录,并输出相关信息。其中,新建的压缩包文件名称中嵌入秒数,通过date +%s命令获取秒刻时间。
在这里插入图片描述
在这里插入图片描述
2、$*和 $#的区别
在这里插入图片描述
在这里插入图片描述
3、创建一个新文件,挂入后台工作,查看进程
在这里插入图片描述

六、总结

  • Shell脚本的内容构成:环境声明、注释文字、执行语句
  • 重定向包括重定向输入、重定向输出、错误重定向
  • 定义或赋值变量时,采用“变量名=变量值”的格式
  • 赋值操作还可以使用单引号、双引号、反撇号、read命令等方式
  • 查看或引用变量的值时,采用“$变量名”的格式
  • 常见的特殊变量包括环境变量、只读变量、位置变量、预定义变量
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雪一更ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值