Shell 脚本编程 01
Shell 概述
- Shell 环境及特点
- 什么是 Shell?
- Shell 的使用方式
- 常见的 Shell 程序种类
- Bash 基本特性
Shell 环境及特点
什么是 Shell?
- 在 Linux 内核与用户之间的解释器程序
- 通常指 /bin/bash
- 负责向内核翻译及传达用户/程序指令
- 相当于操作系统的“外壳”
![](https://i-blog.csdnimg.cn/blog_migrate/8fa2e33443d98a127b962e96218ca6a8.png)
Shell 的使用方式
- 交互式 —— 命令行
- 人工干预、智能化程度高
- 逐条解释执行、效率低
- 非交互式 —— 脚本
- 需要提前设计、智能化难度大
- 批量执行、效率高
- 方便在后台静悄悄地运行
常见的 Shell 程序种类
- 如何切换 Shell 环境
- 通过
usermod
、chsh
更改登录 Shell - 手动执行目标 Shell 程序
cat /etc/shells
- 通过
bin/sh
#多数 Unix 默认的 shell
bin/bash
#多数 Linux 默认的 shell
/sbin/nologin
#非登录 shell
Bash 基本特性
- 命令行环境回顾
- 快捷键、Tab键补齐
- 命令历史
- 命令别名
- 标准输入输出
- 重定向
- 管道操作
案例:Shell 基础应用
- 切换用户的 Shell 环境
- 练习命令历史、命令别名
- 重定向标准输入/输出/错误输出
- 管道操作实践
编写及执行脚本
- 第一个 Shell 脚本
- 什么是 Shell 脚本?
- Shell 版 HelloWorld 的诞生
- 脚本构成及执行
- 规范的脚本构成
- 脚本的执行方式
- 调试 Shell 脚本
- 简单脚本应用
- 示例:快速配置 YUM
- 示例:快速搭建 FTP 服务
第一个 Shell 脚本
什么是 Shell 脚本?
- 提前写好可执行语句,能够完成特定任务的文件
- 顺序、批量化处理
- 解释型程序
![](https://i-blog.csdnimg.cn/blog_migrate/e37a14fc0e86e098d5e8292c8f1afbce.png)
Shell 版 HelloWorld 的诞生
- 脚本创建“三步走”
- 新建文本文件
- 添加可执行的脚本语句(命令行)
- 添加
x
执行权限
脚本构成及执行
规范的脚本构成
#!
脚本声明(使用哪种解释器)#
注释信息(作者信息、步骤、思路、用途、变量含义等)- 可执行的语句
#!/bin/bash
A test program for Shell-Script
echo ‘Hello World’
… …
脚本的执行方式
- 方法一,作为“命令字”
- 指定脚本文件的路径,前提是有
x
权限
- 指定脚本文件的路径,前提是有
- 方法二,作为“参数”
sh 脚本文件路径
source 脚本文件路径
. 脚本文件路径
调试 Shell 脚本
- 主要途径
- 直接观察执行中的输出、报错信息
- 通过
sh -x
开启调试模式 - 在可能出错的地方设置
echo
简单脚本应用
示例:快速配置 YUM
- 为新装的客户机配好 Yum 仓库
- 软件源位于 file:///misc/cd
- 通过脚本建立 /etc/yum.repos.d/dvd.repo 文件
#!/bin/bash
rm -rf /etc/yum.repos.d/*.repo #清理配置目录
echo '[dvd]
name=centos
baseurl=file:///misc/cd
gpgcheck=1' >/etc/yum.repos.d/dvd.repo
示例:快速搭建 FTP 服务
- 为新装的客户机搭建好 vsftp 服务
- 装包、起服务、设开机自运行
- 通过脚本实现上述操作
#!/bin/bash
yum -y install vsftpd &>/dev/null #装包,忽略输出
systemctl start vsftpd #起服务
systemctl enable vsftpd #设为开机自运行
/dev/null
空设备/空文件2>
错误输出重定向command 2> /dev/null
忽略错误输出
&>
所有输出重定向
案例:简单 Shell 脚本的设计
-
问题描述
-
编写三个脚本程序,分别实现以下目标
- 在屏幕上输出一段文字 “Hello World”
- 能够为本机快速配好 Yum 仓库
- 能够为本机快速装配好 vsftpd 服务
Shell 变量
变量的设置和取消
什么是变量
- 以固定名称存放,可能会变化的值
- 提高脚本对任务需求、运行环境变化的适应能力
- 方便在脚本中重复使用
定义/赋值/查看变量
-
定义/赋值变量
变量名=变量值
- 变量名可以有数字、字母、下划线,但不能以数字开头,等号两边不能有空格
X=12 var1=CentOS
-
查看变量
- 引用变量值:
$变量名
- 查看变量值:
echo $变量名
、echo ${变量名}
echo $X,$var1 echo $var16.5 #未定义的变量无取值 echo ${var1}6.5 #变量名易混淆时,以 {} 界定
- 引用变量值:
取消变量
-
变量的遗失
- 退出定义变量的 Shell 环境时,变量会自动失效
- 也可以手动取消:
unset 变量名 ...
unset X echo $X
变量的种类
Shell 变量的分类角度
-
存储类型
- 整数型、浮点型、双精度浮点型、字符型、…
- Shell 脚本语言对存储类型要求较松散
-
使用类型
类型 说明 环境变量 变量名通常都大写,由系统维护,用来设置工作环境,只有个别变量用户可以直接更改 位置变量 bash 内置,存储执行脚本时提供的参数 预定义变量 bash 内置,一类有特殊用途的变量,可直接调用但不能直接赋值或修改 自定义变量 由用户自主设置、修改及使用
环境变量
- 配置文件
/etc/profile
、~/.bash_profile
- 相关操作
env
:列出所有的环境变量set
: 列出所有变量
- 常见的环境变量
- PWD、PATH、USER、LOGNAME、UID、
SHELL、HOME、PS1、PS2、…PS1
一级提示符PS2
二级提示符
- PWD、PATH、USER、LOGNAME、UID、
预定义变量
-
用来保存脚本程序的执行信息
- 直接使用这些变量
- 不能直接为这些变量赋值
变量名 含义 $0 当前所在的进程/脚本名 $$ 当前运行进程的 PID 号 $? 命令执行后的返回状态,0 表示正常,1 或其他值表示异常 $# 已加载的位置变量的个数 $* 所有位置变量的值
位置变量
-
在执行脚本时提供的命令行参数
- 表示为
$n
,n 为序号 $1
、$2
、… …${10}
、${11}
、…
- 表示为
-
应用示例:快速添加用户,并设好登陆密码
- 在执行脚本时,提供用户名作为参数
- 将登录密码设为 123456
#!/bin/bash useradd $1 2> /tmp/err.log echo 123456|passwd --stdin $1 &>/deb/null
变量值及范围控制
扩展赋值操作
-
区别三种定界符
- 单引号 ‘’:禁用扩展,即便 $ 也视为普通字符
- 双引号 “”:允许扩展,以 $ 引用其他变量
- 反撇号 ``:将命令的执行输出作为变量值
echo "当前用户是:$USER" echo '当前用户是:$USER' echo 当前工作目录是:$(pwd)
$(pwd)
:与 `` 等效,但$()
更方便嵌套使用
read
标准输入取值
- read 从键盘读入变量值完成赋值
- 格式:
read [-p "提示信息"]
变量名 -p
,可选-t
,可指定超时秒数
- 格式:
- 终端显示控制
stty -echo
:关闭终端输出(无显示)stty echo
:恢复终端输出(显示)
变量的作用范围
-
局部变量
- 新定义的变量默认只在当前 Shell 环境中有效
- 无法在子 Shell 环境中使用
-
全局变量
- 全局变量在当前 Shell 及子 Shell 环境中均有效
- 使用
export
可将局部变量声明为全局变量export 局部变量名[=变量值]...
:为局部变量添加全局属性export -n 全局变量名...
:取消指定变量的全局属性
HELLO="Hello" sh echo $HELLO exit export HELLO sh echo $HELLO
数值运算
整数运算
基本运算类别
- 加、减、乘、除、取余:+、-、*、/、%
echo $[(10*2+3)/2%3]
expr
运算工具
- 计算指定的表达式,并输出结果
- 格式:
expr 整数1 运算符 整数2 ...
- 乘法操作应采用
\*
转义,避免被作为 Shell 通配符
- 格式:
$[]
算式替换
-
使用
$[]
或$(())
表达式- 乘法操作
*
无需转义,运算符两侧可以无空格 - 引用变量可省略
$
符号 - 计算结果替换表达式本身,可结合
echo
命令输出
X=43 echo $[X+21] echo $((X-21)),$((X*21))
- 乘法操作
变量的自增/减等操作
-
使用
$[]
替换,或者let
命令来完成- 结合
echo
命令查看结果
简写表达式 完整表达式 i + + i++ i++ i = i + 1 i=i+1 i=i+1 i − − i-- i−− i = i − 1 i=i-1 i=i−1 i + = 2 i+=2 i+=2 i = i + 2 i=i+2 i=i+2 i − = 2 i-=2 i−=2 i = i − 2 i=i-2 i=i−2 i ∗ = 2 i*=2 i∗=2 i = i ∗ 2 i=i*2 i=i∗2 i / = 2 i/=2 i/=2 i = i / 2 i=i/2 i=i/2 i % = 2 i\%=2 i%=2 i = i % 2 i=i\%2 i=i%2 i=43 echo $[i+=2] echo $[i-=8] let i++;echo $i let i-=7;echo $i
- 结合
小数运算
整数运算的局限性
- Bash 内建机制仅支持整数值运算
expr
命令、$[]
算式替换 不支持有小数的运算
使用 bc
实现小数运算
-
多数 Linux 系统默认安装此工具
- 支持高精度的数值运算
- 直接运行
bc
可进入交互式运算界面,quit
退出 - 设置
scale=n
可约束小数位
bc 12.34*56.78 # 700.66 scale=4 12.34*56.78 # 700.6652 quit
-
结合管道向
bc
发送表达式- 多个表达式以分号分隔
- 通过
echo
命令 + 管道传递要计算的表达式
A=12.34 echo "$A*56.789"|bc echo "scale=4;$A*56.789;5/3"|bc
小数值的比较
-
基本用法
echo "数值1 比较符 数值2"|bc
- 如果表达式成立,则返回的计算结果为 1,否则返回 0
- 常见的比较操作:>、>=、<、<=、==、!=
A=12.34;B=56.78 echo "$A<=$B"|bc echo "$A>$B"|bc