Linux——Shell脚本编程(1)

一、为什么要学习 Shell 编程 ?

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

二、Shell 使用场景(Shell 是什么,)

①、Shell 是什么 

        由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需另外再开发一个程序让用户直接使用这个程序;该程序作用就是接收用户操作(点击图标、输入命令)并进行简单处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。在用户和内核之间加一层“代理”,既能简化操作又能保障内核安全。
        这个另外开发的程序就是这层“代理”。Linux下这个命令行程序叫 Shell。是一个应用程序,让用户能够更加高效、安全、低成本地使用 Linux 内核,这就是 Shell 的本质。Shell 本身并不是内核的一部分,它只是站在内核基础上编写的一个应用程序,和 QQ、迅雷、Firefox 等其它软件没有什么区别。然而 Shell 也有着它的特殊性就是开机立马启动;用户通过 Shell 来使用 Linux,不启动 Shell 的话用户就没办法使用 Linux。

②、Shell 如何连接用户和内核?

        Shell 程序本身功能是很弱的,比如文件操作、输入输出、进程管理等都得依赖内核。运行一个命令,大部分情况下 Shell 会去调用内核暴露出来的接口,这就是在使用内核,只是这个过程被 Shell 隐藏了起来,它自己在背后默默进行看不到而已。
        接口其实就是一个个函数,使用内核就是调用这些函数。这就是使用内核全部内容了吗?嗯,是的!除了函数,没有别的途径使用内核。比如Shell 中输入cat log.txt命令就可以查看 log.txt 文件中的内容,然而log.txt 放在磁盘的哪个位置?分成了几个数据块?在哪里开始?在哪里终止?如何操作探头读取它?这些底层细节 Shell 统统不知道的,它只能去调用内核提供的 open() 和 read() 函数,告诉内核我要读取 log.txt 文件,然后内核就按照 Shell 的吩咐去读取文件了,并将读取到的文件内容交给 Shell,最后由 Shell 呈现给用户(其实呈现到显示器上还得依赖内核)。整个过程 Shell 就是一个“中间商”,它在用户和内核之间“倒卖”数据。

三、Shell 连接其它程序

        Shell 中输入的命令,有一部分是 Shell 本身自带的叫做内置命令;有一部分是其它应用程序(一个程序就是一个命令)这叫做外部命令。Shell 本身支持的命令并不多功能也有限,但 Shell 可以调用其他程序,每个程序就是一个命令,使得 Shell 命令数量可以无限扩展,结果就是 Shell 功能非常强大,完全能够胜任 Linux 日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。更加惊讶的是,Shell 还可以让多个外部程序发生连接,在它们之间很方便地传递数据,就是把一个程序的输出结果传递给另一个程序作为输入。Shell 强大,并不是 Shell 本身功能丰富,而是它擅长使用和组织其他的程序。可以将 Shell 在整个 Linux 系统中的地位描述成下图所示的样子。注意“用户”和“其它应用程序”是通过虚线连接的,因为用户启动 Linux 后直接面对的是 Shell,通过 Shell 才能运行其它的应用程序。

四、Shell 编程(Shell 是一种脚本语言)

        Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C++、C#、Java、Python 等常见的编程语言并没有什么两样。Shell 虽然没有 C++、Java、Python 等强大,但也支持了基本的编程元素,例如:

  • if...else 选择结构,case...in 开关语句,for、while、until 循环;
  • 变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
  • 函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。

        站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、搭建 Web 运行环境、日志分析等,Shell 都非常合适。
        尤其是 Linux 运维工程师,Shell 更是必不可少的,是必须掌握的技能,它使得我们能够自动化地管理服务器集群,否则你就得一个一个地登录所有的服务器,对每一台服务器都进行相同的设置,而这些服务器可能有成百上千之多,会浪费大量的时间在重复性的工作上。

五、常见的 Shell

常见的 Shell 有 sh、bash、csh、tcsh、ash 等。

sh

        sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

csh

        sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。

BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。

tcsh

        tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

ash

        一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

bash

        bash shell 是 Linux 的默认 shell。bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。

bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。

尽管如此,bash 和 sh 还是有一些不同之处:

  • 一方面,bash 扩展了一些命令和参数;
  • 另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。

六、Shell 脚本的执行方式


脚本格式要求

1)脚本以#!/bin/bash开头
2)脚本需要有可执行权限


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

说明:首先要赋予helloworld.sh 脚本的+x权限, 再执行脚本
比如/hello.sh 或者使用绝对路径/root/shcode/hello.sh

方式2(sh+脚本)

说明:不用赋予脚本+x权限,直接执行即可。
比如 shhello.sh,也可以使用绝对路径


七、编写第一个Shell 脚本

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

vim hello.sh
#!/bin/bash
echo "hello,world~"

 八、参考资料:Shell脚本手册.pdf (aliyuncs.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107319.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 分页器组件+css动画效果

全网都找了一遍没有找到符合UI需求的分页动画,于是就主动上手了 需求: 1、分页最多显示9页,总页数最多显示无上限; 2、点击下一页的时候需要有动画效果过度,如果当前页数是当前显示最后的一页,则停了当前…

Spring MVC:请求转发与请求重定向

Spring MVC 请求转发请求重定向附 请求转发 转发( forward ),指服务器接收请求后,从一个资源跳转到另一个资源中。请求转发是一次请求,不会改变浏览器的请求地址。 简单示例: 1.通过 String 类型的返回值…

MySQL高可用九种方案

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址[1] 参考视频[2] MMM 方案(单主) MySQL 高可用方案之 MMM(Multi-Master Replication Manager&#x…

【PowerQuery】Excel 一分钟以内刷新PowerQuery数据

当需要进行刷新的周期如果小于一分钟,采用数据自动刷新就无法实现自动刷新的目标。那就没有办法了吗?当然不是,这里就是使用VBA来实现自动刷新。这里实现VBA刷新的第一步就是将当前的Excel 保存为带有宏的Excel 文件,如果不带宏则无法运行带有宏代码的Excel文件,保存过程如…

Linux--进程间通讯--FIFO(open打开)

1. 什么是FIFO FIFO命名管道,也叫有名管道,来区分管道pipe。管道pipe只能用于有血缘关系的进程间通信,但通过FIFO可以实现不相关的进程之间交换数据。FIFO是Linux基础文件类型中的一种,但是FIFO文件在磁盘上没有数据块&#xff0c…

golang flag 包的使用指北

说起 golang 的 flag 个包,我们第一反应的是什么呢?至少我曾经第一次看到 flag 包的时候,第一反应是想起写 C 语言的时候咱们用于定义一个表示的,我们一般会命名为 flag 变量 实际上 golang 的 flag 包是用于处理命令行参数的工具…

59-代码随想录--数组--螺旋矩阵

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 模拟顺时针…

ITIL 4—创建、交付和支持—设定工作优先级和管理供应商

5. 设定工作优先级和管理供应商 5.1 为什么我们要对工作优先级排序? 只要工作需求超出了在预期时间内能完成的产能,就会出现排队的情况。在理想情况下,组织的需求没有任何变化,并且拥有满足需求所需的适当质量和数量的资源。但现实里&…

Java定时器

对于定时器的设定,想必大家在不少网站或者文章中见到吧,但是所谓的定时器如何去用Java代码来bianx呢??感兴趣的老铁,可以看一下笔者这篇文章哟~~ 所谓的定时器就是闹钟!! 设定一个时间&#x…

21 搜索二维矩阵 II

搜索二维矩阵 II 题解1 对角线上下循环搜索(超时) 生气!!无脑循环都不超时题解2 无脑循环题解3 学习STL(二分查找) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行…

基于YOLOv8模型的80类动物目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOv8模型的80类动物目标检测系统可用于日常生活中检测与定位车辆目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

Seata在Liunx环境启动配置指定JVM大小

Seata从官网下载下来默认分配的内存为2048MB,测试环境因为部署的程序比较多,给Seata分配2048MB内存也显得很奢侈于是在程序启动的时候配置Seata的内存 bin目录下面一个有四个脚本 在Liunx启动Seata我们需要在seata-setup.sh设置JVM seata-setup.sh设置JVM参考Liu…