Shell编程规范与变量

本文详细介绍了Shell脚本的基础知识,包括Shell的定义、应用场景、作用,以及如何创建和运行Shell脚本。重点讲解了重定向与管道操作,用于高效管理输出。此外,还阐述了Shell变量的类型、作用、赋值方式及其作用范围,以及预定义变量的使用。通过实例展示了如何在Shell脚本中进行变量操作和控制流程,是Linux系统管理员自动化任务的实用教程。
摘要由CSDN通过智能技术生成

前言

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

一、shell脚本概述

1. 什么是shell

Shell俗称壳(用来区别于核),是指"为使用者提供操作界面"的软件(命令解析器)。它接收用户命令,然后调用相应的应用程序。它将用户命令化为计算机能解读的“二进制”,计算机内核调用shell解读出来的二进制,然后硬件调用内核执行用户命令。

2. 应用场景

  • Shell 脚本常用于重复性操作、批量事务处理、自动化运维、服务运行状态监控、定时任务执行等。
  • 像网站发布脚本,每天登录网站,我们会发现每页内容,并不是一成不变的,正常情况下网站会根据开发人员开发完成的代码定期更新网站内容,称之为网站定期发布新版本。
  • 但是对于一些更新间隔比较短的网站,手动执行命令发布是一种重复性的操作,很浪费时间,又比较麻烦。为解决此问题可以开发一个自动发布脚本,就可以高效准确、轻松自如地一键发布脚本了。

3. Shell 作用

  • Shell是 一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。
  • 这种对话方式可以是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
  • 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。
  • 通过 /etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类,如下
[root@localhost ~]#cat /etc/shells 
/bin/sh                 #是bash命令的软链接(已经被/bin/bash所替换)
/bin/bash               #基准于GNU的框架下发展出的Shell
/sbin/nologin
/usr/bin/sh             #已被bash替换
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh                #己经被/bin/ bash所替换

4. 什么是Shell脚本

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

简单地说,只要将平时使用的各种 Linux 命令按顺序保存到一个文本文件,然后添加可执行权限,这个文件就成为了一个 Shell 脚本了。

  • 例如,执行以下操作就可以创建第一个脚本文件:first.sh
[root@localhost ~]#vim first.sh

#!/bin/bash                     #特殊的脚本声明,表示此行以下的代码语句是通过/bin/bash程序来执行
cd /boot
pwd
ls -lh vml*
  • 添加可执行的权限,操作如下
[root@localhost ~]#chmod +x first.sh
  • 执行脚本文件
[root@localhost ~]# ./first.sh       #绝对路径和相对路径的方式,必须要有x权限
[root@localhost ~]#sh first.sh       #sh脚本文件路径
[root@localhost ~]#source first.sh   #source脚本文件路径,也可以通过“.”来执行,可以没有x权限
[root@localhost ~]#sh < first.sh
或
[root@localhost ~]#cat first.sh |sh (bash)

5. 重定向与管道

  • 交互式硬件设备
    标准输入:从该设备接收用户输入的数据
    标准输出:通过该设备向用户输出数据
    标准错误:通过该设备报告执行错误信息
类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/dev/stdout1显示器
标准错误输出/dev/stderr2显示器
  • 重定向操作
类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出>将输出结果保存到指定的文件(覆盖原有内容)
重定向输出>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
标准错误输出2>>将错误信息追加到指定的文件中
混合输出&>将标准输出、标准错误的内容保存到同一个文件中
混合输出2>&1将标准错误输出重定向到标准输出

例如,将当前主机的 CPU 类型信息保存在 kernel.txt 文件中,而不是直接显示在屏幕上,操作如下

[root@localhost /home]#uname -p > kernel.txt
[root@localhost /home]#cat kernel.txt           
x86_64

例如,将内核版本信息追加到 上面的 kernel.txt 文件中,操作如下:

[root@localhost /home]#uname -r >>kernel.txt 
[root@localhost /home]#cat kernel.txt 
x86_64
3.10.0-693.el7.x86_64

例如,命令输出的结果既包括标准输出信息,又包括错误输出信息

[root@localhost ~]#ls /etc/passwd cccc &>> 1.txt
[root@localhost ~]#cat 1.txt
ls: 无法访问cccc: 没有那个文件或目录
/etc/passwd
  • 管道操作

1.管道操作为不同命令之间的协同工作提供了一种机制,位于管道符号 “|” 左侧的命令输出的结果,将作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
2.在 Shell 脚本应用中,管道操作通常用来过滤所需要的关键信息
例如:使用 grep 命令查询使用 “/bin/bash” 作为 Shell 的用户名称时,会输出符合条件的整行内容,在此基础上可以结合管道操作与 awk 命令做进一步过滤,只输出用户名和登录 Shell 列,操作如下:

[root@localhost ~]#grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
cpw:x:1002:1002::/home/cpw:/bin/bash
admin:x:1004:10::/admin:/bin/bash
[root@localhost ~]#grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$6,$7}'
root /root /bin/bash
cpw /home/cpw /bin/bash
admin /admin /bin/bash

(awk 命令的作用时以冒号 “:” 作为分隔,输出第1和第7个区域的字符串,-F 部分用来指定分隔符号)

二、Shell变量的作用、类型

1. 变量的作用

为灵活管理Linux系统提供特定的参数,包含两层意思:

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

2. 变量的类型

  • 自定义变量:由用户自己定义、修改和使用
  • 环境变量:由系统维护,用于设置工作环境(例如PATH)
  • 只读变量:变量值不允许被修改,只允许读
  • 位置变量:通过命令行给脚本程序传递参数
  • 预定义变量:Bash中内置的一类变量,不能直接修改 (例如0 、 0、0、*、$#)

3.自定义变量

3.1 变量定义

变量命名规则:以字母或下划线开头,区分大小写
格式:变量名=变量值
查看变量的值
格式:echo $变量名

[root@localhost ~]#a=ccc
[root@localhost ~]#b=ppp
[root@localhost ~]#c=www
[root@localhost ~]#echo $a $b $c
ccc ppp www

3.2 变量赋值的特殊操作

在等号 “=” 后面直接指定变量内容是为变量赋值最基础的方法,除此之外,还可以使用一些特殊的赋值操作。

  • 双引号:允许通过$符号引用其他变量值
[root@localhost ~]#unset py            #取消变量名
[root@localhost ~]#echo $py

[root@localhost ~]#py="python $version"
[root@localhost ~]#echo $py
python 2
  • 单引号:禁止引用其他变量值,$视为普通字符
[root@localhost ~]#version=2
[root@localhost ~]#py='python $version'
[root@localhost ~]#echo $py
python $version                            #无法调用变量
  • 反撇号:命令替换,提取命令执行后的输出结果
[root@localhost ~]#ls -lh which useradd
ls: 无法访问which: 没有那个文件或目录
ls: 无法访问useradd: 没有那个文件或目录
[root@localhost ~]#ls -lh `which useradd`
-rwxr-x---. 1 root root 116K 116 2016 /usr/sbin/useradd

#上面操作相当于连续执行了两条命令,先通过 which useradd 命令查找useradd 的位置,然后根据查找结果列出文件属性。
执行过程中会用 which useradd 命令的输出结果替换整个反撇号范围。
  • 因为反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用“$()”来代替反撇号操作,以解决嵌套的问题。
#查询提供useradd命令程序的软件包所安装的配置文件位置

[root@localhost ~]#rpm -qc $(rpm -qf $(which useradd))    
/etc/default/useradd
/etc/login.defs
  • read命令
    read 命令用来提示用户输入信息,从而实现简单的交互过程。 执行时将从标准输入设备(键盘)读入一行内容,并以空格为分隔符,将读入的各字段依次赋值给指定的变量(多余的内容赋值给最后一个变量)。

若指定的变量只有一个,则将整行内容赋值给此变量。
例:
执行下面的操作将会等待用户输入文字,并将输入的内容赋值给变量 test

[root@localhost ~]#read test
123123
[root@localhost ~]#echo $test 
123123

为了让交互操作的界面更加友好,read 命令可以结合"-p"选项来设置提示信息,以便告诉用户应该输入什么内容。

[root@localhost ~]#read -p "请输入您的姓名:" name
请输入您的姓名:cui
[root@localhost ~]#echo $name
cui

3.3 设置变量的作用范围

  • 默认情况下,新定义的变量只在当前 Shell 环境中有效,因此称为局部变量。当进入子程序或新的子 Shell 环境时,局部变量将无法再使用。
[root@localhost /home]#name=lisi
[root@localhost /home]#test=20
[root@localhost /home]#bash                #进入shell环境
[root@localhost /home]#echo $name $test
                                           #无法调用父shell环境中的变量
  • 可以通过内部命令 export 将指定的变量导出为全局变量,使用户定义的变量在所有的子 Shell 环境中能够继续使用
[root@localhost /home]#exit                #返回原有的shell环境
exit
[root@localhost /home]#export name test    #将name test设为全局变量
[root@localhost /home]#echo $name $test 
lisi 20
[root@localhost /home]#bash                #进入shell环境
[root@localhost /home]#echo $name $test
lisi 20                                    #可以调用

3.4 数值变量的运算

在Bash Shell 环境中,只能进行简单的整数运算,不支持小数运算,整数值的运算主要通过内部命令 expr 进行,运算符与变量之间必须有至少一个空格。
基本格式如下:

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

加法运算:+
减法运算:-
乘法运算:转义*
除法运算:/
求模(取余)运算:%

[root@localhost /home]#X=55
[root@localhost /home]#Y=15
[root@localhost /home]#expr $X + $Y
70
[root@localhost /home]#expr $X - $Y
40
[root@localhost /home]#expr $X / $Y
3
[root@localhost /home]#expr $X * $Y                  #乘法运算不能仅用 "*" 否则会被当成通配符
expr: 语法错误
[root@localhost /home]#expr $X "*" $Y                
825
[root@localhost /home]#expr $X '*' $Y
825
[root@localhost /home]#expr $X \* $Y
825
[root@localhost /home]#expr $X % $Y
10

4. 预定义变量

  • 预定义变量是由 Bash 程序预先定义好的一类特殊变量,用户只能使用预定义变量,无法创建新的预定义变量,也不能直接为预定义变量赋值
  • 使用 “$” 符号和另一个符号组合表示,常用的几个预定义变量及含义如下所示:
变量说明
$#命令行中位置变量的个数
$*所有位置变量的内容
$?上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0当前执行的进程/程序名
$$表示返回当前进程的进程号
$ !返回最后一个后台进程的进程号
$@表示列出所有位置参数,但是是以单个的形式的列出

总结

  • Shell脚本的内容构成:环境声明、注释文字、执行语句。
  • 重定向与管道操作是 Shell 环境中十分常用的功能,如果能够熟练的掌握并灵活的运用,将有助于编写代码简洁但功能强大的 Shell 脚本程序。
  • 定义或赋值变量时,采用“变量名=变量值”的格式.赋值操作还可使用单引号、双引号、反撤号、read命令等方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值