Shell编程

2023-05-16

一、Shell编程

1. 为什么要学习 Shell编程

1)Linux运维工程师在进行服务器集群管理时,需要编写 Shell程序来进行服务器管理。

2)对于 JavaEE和 Python程序员来说,工作的需要,你的老大会要求你编写一些 Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。

3)对于大数据程序员来说,需要编写 Shell程序来管理集群。

2. Shell是什么

画一个示意图:
在这里插入图片描述
Shell是一个命令行解释器,它为用户提供了一个向 Linux内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell来启动、挂起、停止甚至是编写一些程序。

3. shell编程快速入门

Shell脚本的执行方式

3.1 脚本格式要求

1)脚本以 #!/bin/bash 开头

2)脚本需要有可执行权限

3.2 编写第一个 Shell脚本

  • 需求说明

创建一个 Shell脚本,输出 hello world!

步骤:vim myShell.sh
在这里插入图片描述
注意:
1)每一句结束之后不需要有分号【;】
2)使用脚本必须有可执行权限。

3.3 脚本的常用执行方式

  • 方式 1(输入脚本的绝对路径相对路径

1)首先要赋予 helloworld.sh 脚本的 +x 权限

2)执行脚本
在这里插入图片描述

  • 方式 2(sh+脚本)【不推荐】

说明:不用赋予脚本 +x 权限,直接执行即可。
在这里插入图片描述

4. Shell的变量

4.1 Shell的变量的介绍

1)Linux Shell中的变量分为,系统变量和用户自定义变量。

2)系统变量:$HOME$PWD$SHELL$USER等等

比如: echo $HOME 等等…
在这里插入图片描述
3)显示当前 shell 中所有变量:set

4.2 shell变量的定义

基本语法

  1. 定义变量:变量=值

  2. 撤销变量:unset变量

  3. 声明静态变量:readonly 变量,注意:不能 unset

快速入门

案例 1:定义变量 A

案例 2:撤销变量 A
在这里插入图片描述
案例 3:声明静态的变量 B=2,不能 unsetc
在这里插入图片描述
案例 4:可把变量提升为全局环境变量,可供其他 shell程序使用【后面举例。】

4.3 定义变量的规则

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

2)等号两侧不能有空格

3)变量名称一般习惯为大写

4.4 将命令的返回值赋给变量(重点)

1)A= 'ls -la'反引号,运行里面的命令,并把结果返回给变量 A

2)A=$(ls -la) 等价于反引号
在这里插入图片描述

5. 设置环境变量

基本语法

1)export 变量名=变量值(功能描述:将 shell变量输出为环境变量)

2)source 配置文件 (功能描述:让修改后的配置信息立即生效)

3)echo $变量名(功能描述:查询环境变量的值)

在这里插入图片描述
快速入门

1)在/etc/profile文件中定义 TOMCAT_HOME环境变量
在这里插入图片描述

2)查看环境变量 TOMCAT_HOME的值

echo $TOMCAT_HOME

3)在另外一个 shell程序中使用 TOMCAT_HOME
在这里插入图片描述
注意:在输出 TOMCAT_HOME环境变量前,需要让其生效 source /etc/profile

6. 位置参数变量

介绍

当我们执行一个 shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如: ./myshell.sh 100 200 ,这个就是一个执行 shell的命令行,可以在 myshell脚本中获取到参数信息。

基本语法

$n(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有参数的个数)

位置参数变量应用实例

案例:编写一个 shell脚本 positionPara.sh ,在脚本中获取到命令行的各个参数信息
在这里插入图片描述
在这里插入图片描述

7. 预定义变量

基本介绍

就是 shell设计者事先已经定义好的变量,可以直接在 shell脚本中使用。

基本语法

$$(功能描述:当前进程的进程号(PID))

$!(功能描述:后台运行的最后一个进程的进程号(PID))

$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

应用实例

在一个 shell脚本中简单使用一下预定义变量
在这里插入图片描述

8. 运算符

基本介绍

学习如何在 shell中进行各种运算操作。

基本语法

1)“$((运算式))”或“$[运算式]”
2) expr m + n
注意 expr运算符间要有空格
3) expr m - n
4) expr   \*, /, %   乘,除,取余

应用实例

案例 1:计算(2+3)X4的值

1)$((运算式))
在这里插入图片描述

2)$[运算式]
在这里插入图片描述

3)expr
在这里插入图片描述

案例 2:请求出命令行的两个参数[整数]的和
在这里插入图片描述

9. 条件判断

  • 判断语句

基本语法

[ condition ](注意 condition前后要有空格)

#非空返回 true,可使用$?验证(0为 true,>1为 false)

应用实例

[ atguigu ] 返回 true

[] 返回 false

[condition] && echo OK || echo notok 条件满足,执行后面的语句

常用判断条件

1) 两个整数的比较

= 字符串比较

-lt 小于

-le 小于等于

-eq 等于

-gt 大于

-ge 大于等于

-ne 不等于

2) 按照文件权限进行判断

-r 有读的权限 [ -r文件 ]

-w 有写的权限

-x 有执行的权限

3) 按照文件类型进行判断

-f 文件存在并且是一个常规的文件

-e 文件存在

-d 文件存在并是一个目录

应用实例

案例 1:“ok"是否等于"ok”

判断语句:
在这里插入图片描述

案例 2:23是否大于等于 22

判断语句:
在这里插入图片描述

案例 3:/root/shell/aaa.txt 目录中的文件是否存在

判断语句:
在这里插入图片描述

10. 流程控制

10.1 if判断

基本语法

if  [ 条件判断式 ];then
​	程序
fi

或者
if  [ 条件判断式 ] 
   then
​	  程序
   elif [ 条件判断式 ]
   then
      程序
fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)推荐使用第二种方式。

应用实例

1)请编写一个 shell程序,如果输入的参数,大于等于 60,则输出 “及格了”,如果小于 60,则输出 “不及格”
在这里插入图片描述

10.2 case语句

基本语法

case $变量名 in
"值 1")
  如果变量的值等于值 1,则执行程序  1
;; 
"值 2")
  如果变量的值等于值 2,则执行程序  2
;;
 …省略其他分支…
*)
   如果变量的值都不是以上的值,则执行此程序
;;
esac

应用实例

1)当命令行参数是 1时,输出 “周一”,是 2时,就输出"周二",其它情况输出 “other”
在这里插入图片描述

10.3 for循环

10.3.1 基本语法 1
for 变量  in值  1值  2值  3…
do
​	程序
done

应用实例

案例 1:打印命令行输入的参数【会使用到$* $@】
在这里插入图片描述

10.3.2 基本语法 2
for ((初始值;循环控制条件;变量变化))
do
​	程序
done

应用实例

案例 1:从 1加到 100的值输出显示
在这里插入图片描述

10.4 while循环

10.4.1基本语法 1
while [ 条件判断式 ]
do
​	程序
done
10.4.2 应用实例

案例 1:从命令行输入一个数 n,统计从 1+…+ n的值是多少?
在这里插入图片描述

11. read读取控制台输入

基本语法

read(选项)(参数)

  • 选项

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。

  • 参数

变量:指定读取值的变量名

应用实例

案例 1:读取控制台输入一个 num值

案例 2:读取控制台输入一个 num值,在 10秒内输入
在这里插入图片描述

12. 函数

12.1 函数介绍

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。

12.2 系统函数

basename基本语法

功能:返回完整路径最后 / 的部分,常用于获取文件名basename [pathname][suffix]

basename [string][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

选项:

suffix为后缀,如果 suffix被指定了,basename会将 pathname或 string中的 suffix去掉。

dirname基本语法

功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分

dirname文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

12.3 应用实例

案例 1:请返回 /home/aaa/test.txt的 "test.txt"部分
在这里插入图片描述

案例 2:请返回 /home/aaa/test.txt的 /home/aaa
在这里插入图片描述

12.4 自定义函数

基本语法

[ function ] funname[()]
{
​	Action;
​	[return int;]
}
调用直接写函数名:funname [值]

应用实例

案例 1:计算输入两个参数的和(read), getSum
在这里插入图片描述

13. Shell编程综合案例

需求分析

1)每天凌晨 2:10备份数据库 atguiguDB到 /data/backup/db

2)备份开始和备份结束能够给出相应的提示信息

3)备份后的文件要求以备份时间为文件名,并打包成 .tar.gz的形式
比如:2018-03-12_230201.tar.gz

4)在备份的同时,检查是否有 10天前备份的数据库文件,如果有就将其删除。

编写一个 shell脚本。

思路分析:
在这里插入图片描述
代码实现:
在这里插入图片描述

在这里插入图片描述
自动备份:
在这里插入图片描述


如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell编程 的相关文章

  • 如何使用 shell 脚本解压所有 .tar.gz?

    我试过这个 DIR path tar gz if ls A DIR 2 gt dev null then echo not gz else tar zxvf path tar gz C path tar fi 如果该文件夹有一个 tar 则
  • 导出多个 LD_LIBRARY_PATH 的正确方法

    对于linux的使用 我是一个新手 根据有关我的项目的指南 我必须多次导出 LD LIBRARY PATH 并且我不确定是否不覆盖它们 Cupti Tensorflow CUDAit export LD LIBRARY PATH LD LI
  • 如何在 PHP 中执行 shell 脚本?

    我有一个脚本 var www myscript sh它创建文件夹并运行命令svn update对于我的项目 我需要通过在浏览器中的 PHP 文件中调用它来执行此脚本 即本地主机 test php 我尝试使用函数shell exec and
  • 检查 jar 是否从 shell 运行

    我有一个 java jar 程序 我试图在我的机器启动时运行它 理想情况下 shell 脚本将每 60 秒检查一次以确保 jar 正在运行 我如何检查 jar 是否在 centos 上运行 这似乎不起作用 我当前的 sh 文件 bin ba
  • 从编译的二进制文件创建 RPM 规范文件

    环境是AIX 7 0 RPM版本3 0 5 我对 Unix 世界很陌生 请耐心等待我的无知 我们有 3 种不同类型的文件要打包为 RPM Source binary bainary 文件 大约 160 个 Source ui mm 文件数量
  • 如何将发布档案转换为 git repo

    我有一个发布档案列表 MyProject 0 9 zip MyProject 1 0 zip MyProject 1 3 tar gz MyProject 2 0 tar gz 每个文件都包含一个与存档同名的文件夹 不带文件扩展名 其中包含
  • 在 unix bash 脚本中可以嵌套 Here Document 吗?

    是否可以在另一个heredoc中编写一个heredoc ssh T q yxz server1 lt lt END TEXT ssh T q abc server2 lt lt SUB TEXT SUB TEXT END TEXT Yes
  • 具有多个文件扩展名的查找命令

    我正在查看许多子目录 找到所有以 JPG jpg 和 png 结尾的文件 并将它们复制到一个单独的目录中 但是现在只找到 JPG 有人可以解释我做错了什么吗 find root TEST Images name png o name jpg
  • 使用 find 和 xargs 交互删除文件

    我正在尝试将一些文件从 find 命令传输到交互式删除命令 以便我可以仔细检查要删除的文件 但我遇到了一些麻烦 find name print0 xargs 0 rm i 我认为上面的方法可行 但我只得到一串 rm remove regul
  • 如何在 ruby​​ Kernel.exec 之后运行代码

    我有以下红宝石外壳 usr bin env ruby stdin each line do line pid fork exec line puts after exec gt Process pid Process wait pid en
  • PHP 中是否有相当于 subprocess 的东西?

    在 Java 和 Python 中 你有ProcessBuilder or 子流程 https docs python org 2 library subprocess html可让您使用未转义字符串轻松启动进程的模块 例如 ls some
  • 如何使用 echo 命令写入并附加到文件

    我正在尝试编写一个脚本 它将使用 echo 并写入 附加到文件 但我的语法中已经有了 字符串 说 echo I am Finding difficult to write this to file gt file txt echo I ca
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • Git - 显示远程分支的远程名称

    是否有一个 Git 命令可以显示远程分支的远程名称 目前 我坚持使用 shell utils 从远程分支引用中提取远程名称 例如 echo remote name branch name sed r s 1 remote name 有时出于
  • 有哪些基于对象的 shell?

    我打算写一个面向对象的shell 基于Python 我已经有很多想法了 但在实现它之前 我想通过一些现有的 shell 来激发我的灵感 我所说的面向对象的基本意思是 参数不仅仅是字符串数组 而且是对象数组 返回值也是一个对象 不仅有 std
  • system 和 shell_exec 之间的区别

    有什么区别shell exec and systemPHP 中的方法 两者都采用单个命令行参数并在 PHP 中运行 使用其中一种比另一种更好吗 请参阅此处的解释 http chipmunkninja com Program Executio
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Python 脚本:每次打印新行到 shell,而不是更新现有行

    说到Python 我是个菜鸟 我有一个 python 脚本 它给我这样的输出 last ZVZX W3vo9I Downloading video webpage last ZVZX W3vo9I Extracting video info
  • Bash 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 关键字“if”如何测试一个值是真还是假?

    在 bash 脚本中 if 1 then echo Yes else echo No fi Output Yes 它表示 1 被视为真值 但在代码中 word Linux letter nuxi if echo word grep q le

随机推荐

  • PyTorch:torch.clamp()用法详解

    函数定义 xff1a torch clamp input min max out 61 None 作用 xff1a 限幅 将input的值限制在 min max 之间 xff0c 并返回结果 out Tensor optional 输出张量
  • SSM酒店预订客房管理系统(包含数据库及项目说明)

    hotel 预订宾馆客房入住管理系统 SSM项目 项目下载 xff1a https download csdn net download weixin 45606067 12673204 功能简介 前台给用户界面展示信息 xff0c 以及查
  • resultMap | ssociation | collection具体说明及演示

    1 resultMap 的基本配置项 属性 id 属性 xff1a resultMap 的唯一标识 xff0c 此 id 值用于 select 元素 resultMap 属性的引用 type 属性 xff1a 表示该 resultMap 的
  • @Autowired注解与@Resource注解的区别

    Spring不但支持自己定义的 64 Autowired注解 xff0c 还支持由JSR 250规范定义的几个注解 如 xff1a 64 Resource 64 PostConstruct及 64 PreDestroy 64 Resourc
  • 轻松聊 Maven 的全面学习

    一 Maven介绍 1 什么是maven Maven 是一个项目管理工具 xff0c 它包含了一个 项目对象模型 POM xff1a Project Object Model xff0c 一组标准集合 xff0c 一个项目生命周期 Proj
  • Vue:前端体系、前后端分离

    1 概述 Vue 读音 vju xff0c 类似于 view 是一套用于构建用户界面的渐进式框架 xff0c 发布于 2014 年 2 月 与其它大型框架不同的是 xff0c Vue 被设计为可以自底向上逐层应用 Vue 的核心库只关注视图
  • Vue:MVVM模式和第一个Vue程序

    什么是 MVVM MVVM xff08 Model View ViewModel xff09 是一种软件架构设计模式 xff0c 由微软 WPF xff08 用于替代 WinForm xff0c 以前就是用这个技术开发桌面应用程序的 xff
  • Vue:基础语法

    文章目录 v bindv if v elsev else ifv forv onv on clickv on keydownv on mouseover v text与v htmlv model v bind 我们已经成功创建了第一个 Vu
  • Vue:表单双绑、组件

    什么是双向数据绑定 Vue js 是一个 MVVM 框架 xff0c 即数据双向绑定 xff0c 即当数据发生变化的时候 xff0c 视图也就发生变化 xff0c 当视图发生变化的时候 xff0c 数据也会跟着同步变化 这也算是 Vue j
  • Vue:Axios异步通信、生命周期

    什么是Axios Axios 是一个开源的可以用在浏览器端和 NodeJS 的异步通信框架 xff0c 她的主要作用就是实现 AJAX 异步通信 xff0c 其功能特点如下 xff1a 从浏览器中创建 XMLHttpRequests从 no
  • mysql架构简介、及linux版的安装

    一 mysql的架构介绍 1 mysql简介 1 概述 MySQL是一个关系型教据库管理系统 xff0c 由瑞典MySQL AB公司开发 xff0c 目前属于Oracle公司 MySQL是一种关联歌据库管理系统 xff08 RDBMS xf
  • PyTorch:torch.sort()

    作用 xff1a 对给定tensor的指定维度进行排序 xff0c 返回排序后的结果和排序后的值对应原来维度位置的序号 举例说明 xff1a import torch a 61 torch randint 2 10 6 4 创建shape为
  • mysql索引、索引优化(这一篇包括所有)

    二 索引优化分析 1 性能下降SQL慢 执行时间长 等待时间长 查询语句写的烂索引失效 单值复合 关联查询太多Join xff08 设计缺陷或不得已的需求 xff09 服务器调优及各个参数设置 xff08 缓冲 线程数等 xff09 2 常
  • 查询截取分析

    三 查询截取分析 1 查询优化 1 永远小表驱动大表 xff0c 类似嵌套循环Nested Loop Case EXISTS SELECT FROM table WHERE EXISTS subquery 该语法可以理解为 xff1a 将主
  • mysql锁机制,主从复制

    四 mysql锁机制 1 概述 1 定义 锁是计算机协调多个进程或线程并发访问某一资源的机制 在数据库中 xff0c 除传统的计算资源 xff08 如CPU RAM I O等 xff09 的争用以外 xff0c 数据也是一种供许多用户共享的
  • Linux的安装、目录结构介绍,以及Xshell5远程连接

    一 Linux 介绍 1 Linux课程的内容介绍 2 Linux的应用领域 2 1 个人桌面应用领域 此领域是传统 linux应用最薄弱的环节 xff0c 传统 linux由于界面简单 操作复杂 应用软件少的缺点 xff0c 一直被 wi
  • vim编辑器、用户管理常见命令

    Linux的安装 目录结构介绍 xff0c 以及shell5 远程连接 xff1a https blog csdn net weixin 45606067 article details 107834549 一 vi和 vim编辑器 1 v
  • Linux最全命令总结【有代码演示,没有之一】

    文章目录 一 实用指令1 指定运行级别2 切换到指定运行级别的指令3 帮助指令3 1 介绍3 2 man获得帮助信息3 3 help指令3 4 当一个指令不熟悉如何学习的建议 4 文件目录类4 1pwd指令4 2 ls指令4 3 cd指令4
  • Linux中的任务调度、磁盘分区与挂载、网络配置、进程管理、RPM和YUM

    文章目录 一 crond任务调度1 概述2 基本语法3 快速入门任务的要求步骤如下参数细节说明 4 任务调度的几个应用实例案例1案例 2案例 3 5 crond相关指令 二 Linux磁盘分区 挂载1 分区基础知识分区的方式windows下
  • Shell编程

    一 Shell编程 1 为什么要学习 Shell编程 1 xff09 Linux运维工程师在进行服务器集群管理时 xff0c 需要编写 Shell程序来进行服务器管理 2 xff09 对于 JavaEE和 Python程序员来说 xff0c