目录
引言
在一些复杂的Linux 维护工作中,大量重复性的输入和交互操作不但费时费力,而且容易出错,而编写一个恰到好处的 Shell脚本程序,可以批量处理、自动化地完成一系列维护任务,大大减轻管理员的负担。
shell
一、Shell脚本概述
1、什么是Shell
- Linux系统中运行的一种特殊程序
- 在用户和内核之间之间充当“翻译官”
- 用户登陆Linux系统时,自动加载一个Shell程序
- Bash是Linux系统中默认使用的Shell程序
用户与内核进行交互过程如下:
- 计算机接收用户所输入的的命令
- shell会将所接收到的命令转换成计算机所能识别的二进制语言
- 再将命令传递给系统内核执行
2、Shell的作用
Linux系统中的shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"翻译官"的角色,负责接收用户输入的操作指令命令并进行解释,将需要执行的操作传递给内核调动硬件执行,并输出执行结果。
内核:用于调用计算机硬件资源
shell:将用户指令转换成计算机语言让内核去调用计算机硬件资源
bash是一个文件,linux系统中万物皆文件
bash文件位于/bin/bash
- 注:
- nologin:是奇怪的shell,这个shell可以让用户无法登录主机。
- bash ( /bin/bash)是目前大多数Linux版本采用的默认shell。
二、Shell编程规范
1、创建Shell 程序的步骤
- 创建一个包含命令和控制结构的文件。
- 编辑完之后修改这个文件的权限使它可以执行 #使用chmod +x 文件名
- 检测语法错误(命令集合是否正确) #set -x 追踪脚本是否有故障
- 执行脚本./text.sh
2、Shell脚本的构成
第一行为“#!/bin/b2、Shell脚本的构成ash”,脚本申明(默认解释器):表示此行以下的代码语句是通过/bin/bash程序来执行。
还有其他类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect
注释信息:以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行
可执行语句:如echo命令,用于输出“ ”之间的字符串
先给text.sh添加执行权限
相对路径
绝对路径
Sh 脚本路径
source脚本文件路径
- source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令
- 不需要x权限,也需要使用相对路径或绝对路径
其他方法
sh < text.sh
或者
cat text.sh |sh(bash)
或者
bash text.sh
三、重定向与管道操作
1、交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
2、重定向操作
2.1 重定向操作
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
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 设小数位,3 代表保留四位:
sqrt表示开平方根
bc 除了 scale 来设定小数位之外,还有 ibase 和 obase 来其它进制的运算
进制转换
五、特殊的Shell变量
1、环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件:/etc/profile(全局配置文件) 、~/.bash_profile(用户的独立配置文件)
常用的环境变量
已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行 。
例如:text.sh脚本位于/root目录下,若希望能直接通过文件名称来运行脚本,可以修改PATH变量以添加搜索路径,或者将text.txt脚本复制到现有搜索路径中的某个文件夹下。
上述修改只有当root用户下次登录时才会生效。若希望立即生效,应手动修改环境变量,或者可以加载配置文件执行。
2、只读变量
用于变量值不允许被修改的情况
readonly 命令设置只读变量
readonly PRODUCT #设置为只读变量
echo $PRODUCT
PRODUCT=Python #只读变量不可以被重新赋值
unset PRODUCT #只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决
3、位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
例1:编写一个创建用户的脚本,通过位置变量来实现
例2:编写一个加法运算的脚本,用来计算两个整数的和。
4、预定义变量
预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用*$"符号和另一个符号组合表示,较常用的几个预定义变量的含义如下。
$#: 表示命令行中位置参数的个数。
$*: 表示所有位置参数的内容,这些内容当做一个整体
$@: 表示列出所有位置参数,但是是以单个的形式的列出
$?: 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$ !:返回最后一个后合进程的进程号
六、总结
- Shell脚本的内容构成:环境声明、注释文字、执行语句
- 重定向包括重定向输入、重定向输出、错误重定向
- 定义或赋值变量时,采用“变量名=变量值”的格式
- 赋值操作还可以使用单引号、双引号、反撇号、read命令等方式
- 查看或引用变量的值时,采用“$变量名”的格式
- 常见的特殊变量包括环境变量、只读变量、位置变量、预定义变量