shell编程介绍

244 阅读5分钟

shell

shell脚本概述

  • 将要执行的命令按顺序保存到一个文本文件
  • 给改文件可执行权限
  • 可结合各种shell控制语句以完成更复杂的操作

shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行
  • ................................

定义解释器:

  • #!/bin/bash

表示用什么程序去解释写入的代码

在脚本执行时候,会新开启一个bash,执行完脚本后会回到原来的bash,每个bash之间都是不关联的,单独的个体

脚本执行的方式

  1. 需要执行权限:路径 + 文件名

路径(绝对路径和相对路径都可以)

  • 相对路径:./脚本名
  • 绝对路径:/脚本名
  1. 不需要权限:直接使用shell程序解释
  • shell + 文件名
  • bash + 文件名
  1. source或者 . 不需要权限(不建议使用,会影响当前环境
  • source 文件名
  • . 文件名
  • source=.

脚本执行逻辑

  1. 顺序执行:程序从上到下顺序执行
  2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  3. 循环执行:程序执行过程中需要重复执行多次某段语句

错误类型

  1. 命令错误

不会影响后续执行,只会出现报错信息

  1. 语法错误

会出现语法报错信息

  1. 逻辑错误

不是错误,是能力问题,可以使用bash -x 脚本名对脚本进行追踪,查看哪里有错误;bash -n 脚本名也可以调试脚本

重定向

重定向的意思就是 ,不通过标准输出到屏幕上,输出到你指定的位置

image.png

image.png

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据
  • 标准输出:通过该设备向用户输出数据
  • 标准错误:通过该设备报告执行出错信息

输出重定向

image.png

image.png

输入重定向

image.png

image.png

多行重定向

image.png

read -p

从键盘输入的内容变成变量

image.png

image.png

image.png

常见的shell环境变量

  • 自定义变量:由用户自己定义,修改和使用
  • 环境变量:由系统维护,用户设置工作环境
  • 只读变量:只可以读取不可以更改
  • 位置变量:通过命令行给脚本传递参数
  • 预定义变量:bash中内置的一类变量,不能修改,有规定好的变量,供使用

特殊变量

符号功能
{}定义变量范围,确定一个变量的长度
''里面的参数不被识别,不识别变量,只会被看成普通符号
""能识别变量,并且保留格式
``反撇号,调用命令执行结果,不会被替换变量

image.png

语言分为

  • 汇编语言:需要硬件,源代码写好,一次性编译
  • 解释型语言:shell,写一条,传给bash。执行一条

环境变量

env:可以查看所有环境变量

环境变量功能
$USER表示用户名称
$HOME表示用户的宿主目录
$LANG表示语言和字符集
$PWD表示当前所在工作目录
$PATH表示可执行用户程序的默认路劲

只读变量

变量值不允许修改(重新赋值)的情况

image.png

位置变量

  • 位置变量也称为位置参数
  • 位置变量大于10,需要使用{}括起来

image.png

image.png

预定义变量

系统定义好的变量,直接拿来使用

变量功能
$*表示将所有参数看做一个整体返回,并且返回所有
$@表示将所有参数的内容分割成n份,每份都当做一个整体返回出去
$?表示表示返回上一次命令的结果,0表示成功,非0表示不成功
$#表示命令行中位置参数的总个数
$0表示当前执行脚本的名字
$!|后台执行任务的最后一个id **$@与¥星号(写的时候要写英文)只有在被双引号包起来的时,才会有差异** ## 比较整数数值 公式:[ 整数1 操作数 整数2 ] | 比较 | 功能 | | --- | --- | | -eq | 等于 | -ne|不等于 -gt|大于 -lt|小于 -le|小于或者等于 -ge|大于或者等于 ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7e9c6b7cca4f4bf6b4cc41f3cdcca7a1~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/877e12fd6a704939bb8de26191c1596d~tplv-k3u1fbpfcp-watermark.image?) ## 实验 提取CPU型号: ![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c04b3494e7784c80b53f91cd55c00db3~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0964ed293d554885beb91f6b4a6f2eff~tplv-k3u1fbpfcp-watermark.image?) - -f2:表示取第二列 - cut -d:指定分割符 ### 写在脚本里面 名字自定义一下 ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d23603beef334e609fffeb2c52a407d2~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/73a256e030bc4cc8804cc3ba3b7dccb1~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/98652fd2eb8a4351b87e10dd7a1846b8~tplv-k3u1fbpfcp-watermark.image?) ## 逻辑测试 - &&:逻辑与,表示全真才为真,一假则全为假 - ||:逻辑或,表示一真即为真,有一个为假也是真 - !:逻辑否 ## echo语句 | echo命令 | 意思 | | --- | --- | | echo -n | 表示不换行输出 | echo -e|表示输出转义符 ### 选项 | 选项 | 功能 | | --- | --- | | \n | 输出换行 | \r|光标移至行首,并且不换行 \s|当前shell的名称,如bash \t|插入Tab键 \f|换行,但光标仍停留在原处 \\|表示插入“\”本身 \b|表示退格,不显示前一个字符 \c|抑制更多的输出或不换行 ![image.png](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a3f2ed096253470a8aef7ffc012f6df2~tplv-k3u1fbpfcp-watermark.image?) ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ec6183e84a24429f9e1e3d6859c9850a~tplv-k3u1fbpfcp-watermark.image?) **注意:空格键和Tab键不能混用** ## date 查看当前系统时间 - -d:你描述的日期,显示指定字符串所藐视的时间,而非当前时间 - %F:完整的日期格式,等价于%Y-%m-%d - %T:时间(24小时制)(hh:mm:ss) ![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d6e223825fb54c099bb108e75fe15e3c~tplv-k3u1fbpfcp-watermark.image?) ## 文件测试test 测试文件是否为目录 - test -d /etc -d 前面一定要有空格,也是测试文件是否是目录,打全括号 - [ -d /dev ] ### 操作符 | 操作符 | 功能 | | --- | --- | | -d | 测试是否为目录(directory) | -e|测试目录文件是否存在(exist) -a|测试目录或文件是否存在(exist) -f|测试是否为文件 -r|测试当前用户是否有权限读取 -w|测试当前用户是否有权限写入 -x|测试当前用户是否有权限执行 -L|测试是否为软连接文件 - 测试权限是以操作权限为准 - -a不建议使用 - **删掉软连接** **rm -rf 123** - **将软连接里面的文件全部删掉** **rm -rf 123/**