Shell 脚本编程 01

本文介绍了Shell脚本编程的基础知识,包括Shell概述、环境特点、不同使用方式、常见Shell种类、Bash基本特性、变量设置与运算、以及如何编写并执行脚本,如HelloWorld示例、YUM配置和FTP服务的快速搭建。
摘要由CSDN通过智能技术生成

Shell 脚本编程 01

Shell 概述

  • Shell 环境及特点
    • 什么是 Shell?
    • Shell 的使用方式
    • 常见的 Shell 程序种类
    • Bash 基本特性

Shell 环境及特点

什么是 Shell?
  • 在 Linux 内核与用户之间的解释器程序
    • 通常指 /bin/bash
    • 负责向内核翻译及传达用户/程序指令
    • 相当于操作系统的“外壳”
Shell 的使用方式
  • 交互式 —— 命令行
    • 人工干预、智能化程度高
    • 逐条解释执行、效率低
  • 非交互式 —— 脚本
    • 需要提前设计、智能化难度大
    • 批量执行、效率高
    • 方便在后台静悄悄地运行
常见的 Shell 程序种类
  • 如何切换 Shell 环境
    • 通过 usermodchsh 更改登录 Shell
    • 手动执行目标 Shell 程序
    • cat /etc/shells

bin/sh #多数 Unix 默认的 shell
bin/bash #多数 Linux 默认的 shell
/sbin/nologin #非登录 shell

Bash 基本特性
  • 命令行环境回顾
    • 快捷键、Tab键补齐
    • 命令历史
    • 命令别名
    • 标准输入输出
    • 重定向
    • 管道操作
案例:Shell 基础应用
  1. 切换用户的 Shell 环境
  2. 练习命令历史、命令别名
  3. 重定向标准输入/输出/错误输出
  4. 管道操作实践

编写及执行脚本

  • 第一个 Shell 脚本
    • 什么是 Shell 脚本?
    • Shell 版 HelloWorld 的诞生
  • 脚本构成及执行
    • 规范的脚本构成
    • 脚本的执行方式
    • 调试 Shell 脚本
  • 简单脚本应用
    • 示例:快速配置 YUM
    • 示例:快速搭建 FTP 服务

第一个 Shell 脚本

什么是 Shell 脚本?
  • 提前写好可执行语句,能够完成特定任务的文件
    • 顺序、批量化处理
    • 解释型程序
Shell 版 HelloWorld 的诞生
  • 脚本创建“三步走”
    1. 新建文本文件
    2. 添加可执行的脚本语句(命令行)
    3. 添加 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 脚本的设计
问题描述

编写三个脚本程序,分别实现以下目标

  1. 在屏幕上输出一段文字 “Hello World”
  2. 能够为本机快速配好 Yum 仓库
  3. 能够为本机快速装配好 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 二级提示符
预定义变量
  • 用来保存脚本程序的执行信息

    • 直接使用这些变量
    • 不能直接为这些变量赋值
    变量名含义
    $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
    

数值运算

  • 整数运算
    • 基本运算类别
    • expr 运算工具
    • $[] 算式替换
    • 变量的自减/减等操作
  • 小数运算
    • 整数运算的局限性
    • 使用 bc 实现小数运算
    • 小数值的比较

整数运算

基本运算类别
  • 加、减、乘、除、取余:+、-、*、/、%
  • 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=i1
    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=i2
    i ∗ = 2 i*=2 i=2 i = i ∗ 2 i=i*2 i=i2
    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
    
  • 39
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值