Linux理论——Shell编程规范与变量

前言

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

一、Shell脚本概述

Shell脚本的概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行权限
  • 可结合各种Shell控制语句以完成更复杂的操作
    Shell脚本应用场景
  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行

1、Shell脚本的作用

Shell的作用——命令解释器,“翻译官”

  • 介于系统内核与用户之间,负责解释命令行
    在这里插入图片描述

用户的登录Shell

  • 登录后默认使用的Shell程序,一般为 /bin/bash
  • 不同Shell的内部指令、运行环境等会有所区别
    在这里插入图片描述

2、Shell编程规范

编写脚本代码

  • 使用vim文本编辑器
  • 每行一条Linux命令,按执行顺序依次编写
    在这里插入图片描述

赋予可执行权限

  • 使脚本具有可执行属性
    在这里插入图片描述

执行脚本文件:

  • 方法一:脚本文件路径(绝对路径与相对路径)
    在这里插入图片描述
  • 方法二:sh 脚本文件路径
    在这里插入图片描述
  • 方法三:source 脚本文件路径
    在这里插入图片描述
    也可以通过“.”来执行

更完善的脚本构成

  • 脚本声明
  • 注释信息
  • 可执行语句
    在这里插入图片描述

3、重定向与管道

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息
    在这里插入图片描述

重定向操作
在这里插入图片描述
管道操作符号“|”

  • 将左侧的命令输出结果,作为右侧命令的处理对象
cmd1 | cmd2 【... | cmdn】

在这里插入图片描述
上例中 awk 命令的作用是以冒号 “:” 作为分隔,输出第1和第7个区域的字符串。
其中的 “-F” 部分用来指定分隔符号(未指定时,默认以空格或制表符分隔)。
在这里插入图片描述

二、Shell脚本变量

Shell变量的作用

  • 用来存放系统和用户需要使用的特定参数(值)
    ◆变量名:使用固定的名称,由系统预设或用户定义
    ◆变量值:能够根据用户设置、系统环境的变化而变化

变量的类型

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

1、自定义变量

定义一个新的变量

  • 变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值

查看变量的值

echo $变量名

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

2、赋值时使用引号

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

从键盘输入内容为变量赋值

read 【-p “提示信息”】变量名

(1)双引号(")

双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略。
在这里插入图片描述
在双引号范围内,使用 “$” 符号可以引用其他变量的值(变量引用),从而能够直接调用现有变量的值来赋给新的变量。
在这里插入图片描述

(2)单引号(’)

当要赋值的内容中包含 “$” “"” “\” 等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号时,需要使用 “’” 符号进行转义,以免冲突。
在这里插入图片描述

(3)反撇号(`)

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反括号起来的范围必须是能够执行的命令行,否则将会出错。
例如,若要哦在一行命令中查找 tar 命令程序的位置并列出其详细属性,可以执行以下操作:
在这里插入图片描述
上述操作相当于连续执行了两条命令——先通过 which useradd 命令查找出 useradd 命令的程序位置,然后根据查找结果列出文件属性。执行过程中,会用 which useradd 命令的输出结果替换整个反撇号范围。

(4)read命令

read命令用来提示用户输入信息,从而实现简单的交互过程。执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个变量)。若指定变量只有一个,则将整行内容赋值给此变量
在这里插入图片描述

3、设置变量的作用范围

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

默认情况下,新定义的变量只在当前的 Shell 环境中有效,因此称为局部变量。当进入子程序或新的子 Shell 环境时,局部变量将无法再使用。例如,直接执行 Bash 进入一个新的子 Shell 脚本后,将无法引用父级 Shell 环境中定义的 Product、Version 等变量。

[root@localhost ~]# echo "$Product $Version"	//查看当前定义的变量值
Python 2.7.13
[root@localhost ~]# bash	//进入子Shell 环境
[root@localhost ~]# echo "$Product $Version" //无法调用父Shell 环境中的变量
[root@localhost ~]# exit	//返回原有的Shell 环境

为了使用户定义的变量在所有的子 Shell 环境中能够继续使用,减少重复设置工作,可以通过内部命令 export 将指定的变量导出为全局变量。用户可以同时指定多个变量名称作为参数(无须使用“$”符号),变量名之间以空格分隔。

[root@localhost ~]# echo "$Product $Version"	//查看当前定义的变量值
Python 2.7.13
[root@localhost ~]# export Product Version	//将Product、Version 设为全局变量
[root@localhost ~]# bash	//进入子Shell 环境
[root@localhost ~]# echo "$Product $Version"
Python 2.7.13	//可以调用父Shell 的全局变量
[root@localhost ~]# exit	//返回原有的Shell 环境

使用 export 导出全局变量的同时,也可以为变量进行赋值,这样在新定义全局变量时就不需要提前进行赋值了。例如,执行以下操作可以直接新建一个名为 FQDN 的全局变量。

[root@localhost ~]# export FQDN="www.jb-aptech.com.cn"
[root@localhost ~]# echo $FQDN
www.jb-aptech.com.cn

4、数值变量的运算

Shell 变量的数值运算多用于脚本程序的过程控制(如循环次数、使用量比较等,后续章节会介绍)。在 Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令 expr 进行,基本格式如下所示。需要注意,运算符与变量之间必须有至少一个空格。

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

其中,变量 1、变量 2……对应为需要计算的数值变量(需要以“$”符号调用),常用的几种运算符如下所述:

  • +:加法运算
  • -:减法运算
  • *:乘法运算,注意不能仅使用“*”符号,否则将被当成文件通配符
  • /:除法运算
  • %:求模运算,又称为取余运算,用来计算数值相除后的余数

以下操作设置了 X(值为 35)、Y(值为 16)两个变量,并依次演示了变量 X、Y 的加、减、乘、除、取模运算结果。

[root@localhost ~]# X=35 
[root@localhost ~]# Y=16 
[root@localhost ~]# expr $X + $Y 51
[root@localhost ~]# expr $X - $Y
19
[root@localhost ~]# expr $X \* $Y
560
[root@localhost ~]# expr $X / $Y
2
[root@localhost ~]# expr $X % $Y
3

若要将运算结果赋值给其他变量,可以结合命令替换操作(使用反撇号)。例如,计算 变量 Y 的 3 次方,并将结果赋值给变量 Ycube。

[root@localhost ~]# Ycube=`expr $Y \* $Y \* $Y`
[root@localhost ~]# echo $Ycube
4096

5、特殊变量

除了用户自行定义的 Shell 变量以外,在 Linux 系统和 Bash Shell 环境中还有一系列的特殊变量——环境变量、只读变量、位置变量、预定义变量。下面分别进行介绍。

(1)环境变量

环境变量指的是出于运行需要而由 Linux 系统提前创建的一类变量,主要用于设置用户的工作环境,包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。环境变量的 值由 Linux 系统自动维护,会随着用户状态的改变而改变。
使用 env 命令可以查看到当前工作环境下的环境变量,对于常见的一些环境变量应了解其各自的用途。例如,变量 USER 表示用户名称,HOME 表示用户的宿主目录,LANG 表示语言和字符集,PWD 表示当前所在的工作目录,PATH 表示命令搜索路径等。在这里插入图片描述
PATH 变量用于设置可执行程序的默认搜索路径,当仅指定文件名称来执行命令程序时,Linux 系统将在 PATH 变量指定的目录范围查找对应的可执行文件,如果找不到则会提示“command not found”。例如,first.sh 脚本位于/root 目录下,若希望能直接通过文件名称来运行脚本,可以修改 PATH 变量以添加搜索路径,或者将 first.sh 脚本复制到现有搜索路径中的某个文件夹下。

[root@localhost ~]# ls -lh /root/first.sh	//确认脚本位置
-rwxr-xr-x. 1 root root 27 Jul 4 09:24 /root/first.sh
[root@localhost ~]# echo $PATH	//查看当前搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin
[root@localhost ~]# first.sh	//直接执行时找不到命令
-bash: first.sh: command not found
[root@localhost ~]# PATH="$PATH:/root"	//将/root 添加到搜索路径
[root@localhost ~]# echo $PATH	//查看修改后的搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin:/root 
[root@localhost ~]# first.sh	//直接以文件名运行脚本
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 5.2M Apr 12 13:20
vmlinuz-0-rescue-b15df1eb8205483f9f70c79709810abc
-rwxr-xr-x. 1 root root 5.2M Nov 22 2016 vmlinuz-3.10.0-514.el7.x86_64

在 Linux 系统中,环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。除此之外,每个用户还有自己的独立配置文件(~/.bash_profile)。若要长期 变更或设置某个环境变量,应在上述文件中进行设置。例如,执行以下操作可以将记录的历 史命令条数改为 200 条(默认为 1000 条),只针对 root 用户。在这里插入图片描述
上述修改只有当 root 用户下次登录时才会生效。若希望立即生效,应手动修改环境变量,或者可以加载配置文件执行。在这里插入图片描述

(2)只读变量

Shell 变量中有一种特殊情况,一经设定,其值是不可改变的,这种变量被称为只读变量。在创建变量的时候可将其设置为只读属性,也可以将已存在的变量设置为只读属性,只读变量主要用于变量值不允许被修改的情况。例如脚本中定义了一个变量“log_path”用来定义日志文件的路径,在脚本的执行过程中如果不想被修改,就可以将该变量设置为只读变量。 使用 readonly 命令将变量定义为只读变量,定义之后不能通过再次赋值的方式进行修改。

[root@localhost ~]# name=cloud
[root@localhost ~]# readonly name	//设置为只读变量
[root@localhost ~]# echo $name
cloud
[root@localhost ~]# name=yun
-bash: name: readonly variable	//只读变量不可以被重新赋值
[root@localhost~]#
[root@localhost ~]# unset name	//只读变量不可以被删除
-bash: unset: name: cannot unset: readonly variable

上述 unset 命令通常用于删除变量

(3)位置变量

为了在使用 Shell 脚本程序时,方便通过命令行,为程序提供操作参数,Bash 引入了位置变量的概念。当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符 串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示。例如,当执行命令行“ls -lh
/boot/”时,其中第 1 个位置变量为“-lh”,以“$1”表示;第 2 个位置变量为“/boot/”,以“$2”表示。命令或脚本本身的名称使用“$0”表示,虽然$0 与位置变量的格式相同,但是$0 属于预定义变量而不是位置变量。
为了说明位置变量的作用,下面编写一个加法运算的小脚本 adder2num.sh,用来计算两个整数的和。需要计算的两个整数在执行脚本时以位置变量的形式提供。

[root@localhost ~]# vim adder2num.sh
#!/bin/bash 
SUM=`expr $1 + $2`
echo "$1 + $2 = $SUM"
[root@localhost ~]# chmod +x adder2num.sh
[root@localhost ~]# ./adder2num.sh 12 34	//$1 为 12、$2 为 34 的情况
12 + 34 = 46
[root@localhost ~]# ./adder2num.sh 56 78	//$1 为 56、$2 为 78 的情况
56 + 78 = 134

(4)预定义变量

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

  • $#:表示命令行中位置参数的个数
  • $*:表示所有位置参数的内容
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $0:表示当前执行的脚本或程序的名称

为了说明预定义变量的作用,下面编写一个备份操作的小脚本,用来打包命令行指定的 多个文件或目录,并输出相关信息。其中,新建的压缩包文件名称中嵌入 UNIX 时间戳(从1970 年 1 月 1 日至今经过的秒数),通过“date +%s”命令获取。
在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ZG_66/article/details/107917721
今日推荐