目录
前言
每一个合格 的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容。只有这样才能提升运维人员的工作效率,适 应曰益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础
一、Shell脚本概述
1.1 Shell的作用
命令解释器,“翻译官”介于系统内核与用户之间,负责解释命令行
1.2 Shell编程规范
编写第一个Shell脚本
ShellI脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句以完成更复杂的操作
简单地说,只要将平时使用的各种Linux命令按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个Shell脚本了
ShellI脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
。。。。。
用户的登录Shell
登录后默认使用的Shell程序,一般为/bin/bash
不同Shell的内部指令、运行环境等会有所区别
[root@localhost~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
…
Linux常用shell种类
不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。
1、bash
大多数Linux系统默认使用的shell,bash shell是Bourne shell 的一个免费版本,它是最早的Unix shell, bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。
2、csh
C shell使用的是“类C”语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代。
3、ksh
Korn shell 的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh, "ish_有42条内部命令,与bash相比有一定的限制性。
4、tcsh
tcsh是csh的增强版,与C shell完全兼容。
5、sh
是一个快捷方式,已经被/bin/bash所取代。
6、nologin
指用户不能登录
7、zsh
目前Linux里最庞大的一种shell: zsh。它有84个内部命令,使用起来也比较复杂。一般情况下,不会使用该shell。
编写脚本代码——格式
使用vim文本编辑器
每行一条Linux命令,按执行顺序依次编写
[root@localhost ~]# vim first.sh
#!/bin/bash #用/bin/bash去解释此脚本
#查询/boot目录下所有的子文件和子目录 #此脚本描述
cd /boot #切换到当前路径
echo "您当前位于:” #输出提示信息
pwd #显示当前路径
echo "显示当前路径下以vml开头的文件或目录" #输出提示信息
ls -lh vml*
执行方式:
方法一: sh 脚本文件路径
[root@localhost/]# sh first.sh #不需要执行权限也可以操作
方法二: ./ 脚本文件路径
[root@localhost ~]# ./ first.sh #需要执行权限来操作
[root@server2 ~]# chmod +x first.sh #需要提权方可操作
方法三: source 脚本文件路径 #立马让工作环境生效
[root@localhost /]# source first.sh #也不需要执行权限可以操作
/boot
[root@localhost boot]# pwd ###真的会自动切入脚本中的环境
1.3 重定向与管道
1.31 重定向
交互式硬件设备
标准输入:默认的设备是键盘,文件编号为0,命令将从标准输入文件中读取在执行过程中需要的输入数据
标准输出:默认的设备是显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件
标准错误输出:默认的设备是显示器,文件编号为2,命令将执行期间的各种错误信息发送到标准错误文件
标准输入、标准输出和标准错误默认使用键盘和显示器作为关联的设备,与操作系统进行交互,完成最基本的输入、输出操作,即从键盘接收用户输入的各种命令字串、辅助控制信息,并将命令结果输出到屏幕上;如果命令执行出错,也会将错误信息反馈到屏幕上。
在实际的 Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。
1.32 重定向操作
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”
read——读入;echo——查看变量的值
read使用的语法:read (选项) (参数)
选项:
-p: 指定读取值时候的提示符
-t: 指定读取值时候等待的时间(秒)
-a array:指定输如一个数组,赋值给array
-n 2: 指定输入字符的任意类型的个数为2
注:不加参数,默认赋值给变量:REPLY
例1:
[ root@server2 ~]# read a #输入变量a
abc #输入变量a的值
[ root@server2 ~]# echo $a #查看变量a
abc #获取变量a的值
例2:
[ root@server2 ~]# read -p "输入a变量的变量值:" a #输入变量a,带提示符
输入a变量的变量值:abc123ttt #输入变量a的值,带提示符
[ root@server2 ~]# echo $a #查看变量a
abc123ttt #获取变量a的值
1、标准输入:–stdin
例:密码免交互
[ root@server2 ~]# vi passwd .txt #创建txt
123123 #输入数字
[ root@server2 ~]# useradd lisi #创建lisi账户
[ root@server2 ~]# passwd --stdin lisi < passwd.txt #密码直接覆盖
更改用户lisi 的密码。
passwd:所有的身份验证令牌已经成功更新。
2、重定向输出:“>”“>>”
重定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件
例:
[ root@server2 ~]# uname -p > kernel.txt #显示CPU的类型覆盖到kernetl.txt
[ root@server2 ~]# cat kernel.txt
x86_64
这个结果是覆盖
[ root@server2 ~]# uname -r >> kernel.txt #显示内核版本信息追加到kernel.txt
[ root@server2 ~]# cat kernel.txt
x86_64
3.10.0-693.e17.x86_64
这个结果是追加
3、错误重定向输出
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符,其中“2”是指错误文件的编号(在使用标准输出、标准输入重定向时,实际上省略了1、0编号)
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据:对于Shell脚本,还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁。将一些重要的执行程序的错误重定向到某个文件中
例:
[ root@server2 ~]# vim http.sh
#!/bin/ bash
# apache server install #脚本描述
cd /usr/local/httpd-2.4.25/ &> /opt/ cd_err.txt
./ configure &> lopt/con_err.txt
make &> /opt/make_err.txt
make install & /opt/makeinstall_err.txt
./http.sh执行没有报错因为错误重定向到别的文件中了,查看文件能看到
1.33 管道操作
管道操作符号”I”
将左侧的命令输出结果,作为右侧命令的处理对象
-F:分割 ; awk:输出 print:字段
例1:
[rootserver2 ~]# df -Th | grep "/$" | awk '{print $6}' #查看挂载情况并检索出“/”结尾的值输出第六个字段
例2:
[root@localhost ~]# grep "bash$" /etc/passwd #检索/etc/passwd里以“bash”结尾的数据
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: ‘{print $1,$7}’
#检索/etc/passwd里以“bash”结尾的数据并以冒号:分隔,输出第1、7个字段
root /bin/bash
二、Shell脚本变量
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
2.1 自定义变量
定义一个新的变量
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
查看变量的值:echo $变量名
例:
[root@server2 ~]# a=c
[root@server2 ~]# echo $a
c
[ root@server2 ~]# al=c1
[ root@server2 ~]# echo $a $al
c c1
赋值时使用引号
双引号:允许通过
符
号
引
用
其
他
变
量
值
单
引
号
:
禁
止
引
用
其
他
变
量
值
,
符号引用其他变量值 单引号:禁止引用其他变量值,
符号引用其他变量值单引号:禁止引用其他变量值,视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
例:
从键盘输入内容为变量赋值
格式:read [-p “提示信息"] 变量名
例:
[ root@server2 ~]# read -p "输入a变量的变量值:" a #输入变量a,带提示符
输入a变量的变量值:abc123ttt #输入变量a的值,带提示符
[ root@server2 ~]# echo $a #查看变量a
abc123ttt #获取变量a的值
设置变量的作用范围——全局变量export
两种格式可以混合使用
格式1: export 变量名 …
格式2: export 变量名=变量值 …
例:
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3] …
常用运算符:
加法运算: +
减法运算: -
乘法运算: *
除法运算: /
求模(取余) 运算: %
扩展:
求两个数+、一、、/、%的方法有三种:
例:
expr 3 +4
echo $ ((3+4))
echo $[3+4]
注:乘法在直接使用过程中是需要*的,因为是shell正则表达式中的特殊字符,所以需要转义字符\才能表示其真实含义,但是在(())和[]中不需要转义字符。
2.2 特殊的Shell变量
1、环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~/.bash _profile、
/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
~/.bash _profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时该文件仅仅执行一次
常见的环境变量
PWD、 PATH #PATH:可执行命令路径,使用命令没有时要添加命令路径
USER、SHELL、HOME
2、只读变量——readonly
用于变量值不允许被修改和删除的情况
例:
3、位置变量
表示为$n, n为1~9之间的数字
格式:变量 对象 对象 对象… #对象可以多个,最多9个
4、预定义变量
$#:命令行中位置变量的个数
∗
和
*和
∗和@:所有位置变量的内容
#在shell中,
@
和
@和
@和*都表示命令行所有参数(不包含
0
)
,
但
是
0),但是
0),但是*将命令行的所有参数看成一个整体,而$@则区分各个参数
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程/程序名
例:
[ root@server2 ~]# vim bak. sh
#! /bin/ bash
# 打包文件
a=bak- `date +%F`.gz
tar zcvf $a $* &> /dev/null #将a文件tar解包所有内容放到/dev/null文件内
echo "已执行$0脚本" #提示当前执行的脚本
echo "已执行$#个对象备份" #提示已执行多少个对象备份
echo "打包内容:$*" #提示打包内容所有位置变量内容