Linux: Shell编程入门
Shell 编程入门
1 ) Shell 概念
- shell 是 在英语中 壳, 外壳的意思
- 可以把它想象成嵌入在linux这样的操作系统里面的一个微型的编程语言
- 不像C语言, C++ 或 Java 等编程语言那么完整,它可以帮我们完成很多自动化任务
- 例如保存数据监测系统的负载等等,我们同样可以用C语言完成类似的任务
- Shell 相比C语言的优势在于它是完全嵌入在linux中的,不需要安装,不需要编译
- 而且我们不需要学习太多新的东西
- 我们在linux中用的那些命令,都可以用在shell语言中,如:ls, cd, grep
2 ) Shell 脚本
- 脚本,script 是批处理文件的延伸,是一种纯文本保存的程序
- 计算机的脚本程序是确定的一系列控制计算机进行运算操作动作的组合
- 在其中可以实现一定的逻辑分支
3 )Shell的分类
- 我们把 linux中的两个不同的环境分开来看:终端命令行环境,图形界面环境
- 在大多数的时候,我们使用的是图形界面,桌面版
- 在终端命令行当中,可以实现很多在图形界面中不能完成的复杂任务
- linux有不少图形界面环境,例如 GNOME, KDE, XFCE等
- 但是终端命令行环境貌似长得都一样,但也有好多种,对应的就是不同的Shell
- 不同的终端命令行之间的区别不像图形界面那么明显
- 因为终端命令行一般都是黑底白字, 颜色一般可配置,根据Shell的不同,命令行所能提供的功能也不同
- 因此我们可以把不同的终端命令行环境称为不同的shell了,下面进行分类
3.1 Sh
- Bourne Shell 的缩写,可以说是目前所有Shell的祖先
3.2 Bash
- Bash: Bourne Again Shell 的缩写
- 比 Sh 多了一个 Again, 英文: 又, 再
- 它是 Sh的进阶版本,比Sh更优秀
- 它也是目前大多数linux发行版以及苹果的macos操作系统的默认的shell
3.3 Ksh
- Ksh: Korn Shell 的缩写
- 一般在收费的 Unix 版本上比较多见,但也有免费版本的
3.4 Csh
- Csh 是 C Shell 的缩写
- 这个shell, 它的语法有点类似c语言
3.5 Tcsh
- Tcsh 是 Tenex C Shell 的缩写
- Csh 的优化版本
3.6 Zsh
- Zsh: Z Shell 的缩写
- 比较新的一个Shell, 集 Bash, Ksh, Tcsh 各家之大成
- Github 上又一个 Zsh 的轻松配置程序叫做 oh-my-zsh
各个 Shell 的演化关系
- 首先Sh是最古老的,然后它演化出来Csh, Bash, Ksh,然后Csh又演化出Tcsh
- Zsh 是集 Bash, Ksh, Tcsh 之各家大成,但实际上, Sh 始终比 Bash 的使用面更广
- linux 是模仿 unix 而创建的,几乎所有源自于unix的操作系统,包括linux都是有Sh的
- 但不是每一个系统都有Bash
Shell 的作用
- shell 是管理命令行的程序,其实Shell这个程序在等待你输入那些命令
- shell 帮助记住在终端中输入的命令:键盘 ↑ ↓ 键可以回退追踪之前输入的命令
- 用组合键 Ctrl + R 在终端的历史记录中搜索执行过的命令
- 用Tab键自动补全输入过的命令,比如输入 ca 再按两次TAB就会提示所有ca开头的命令
- 用Tab键也可自动补全路径
- 也可以控制进程,把进程放入后台或暂停,如:CTRL + C, CTRL + Z
- 还可以重定向命令,用到 <, >, |, 等符号
- 还可以定义别名,例如:ll 可以被定义为 ls -al 的别名
- 简而言之,shell 提供的所有可以让你去运行命令的基础功能
- 用下图来简单的表示用户share操作系统内核和硬件的一个关系
- Shell 就像用户和操作系统之间的一个中介或桥梁一样
- 这也是它的名字Shell的由来,很像去包裹操作系统内核的一个外壳
- Shell 本来在英语当中就是外壳的意思,Shell 就有点像鸡蛋的外壳一样
- 里面就有点像蛋白和蛋黄,我们可以把 Shell 比作一个蛋壳
- 这个内核是蛋白,然后这个硬件就是蛋黄, 整体就是像一颗鸡蛋
- .bashrc 这个文件其实就是 bash 的一个配置文件
- 每个linux用户都可以定义自己的 .bashrc 来配置 bash 这个Shell
- 它可以指定bash的命令提示符样式定义别名等等
- 在使用linux的过程中,我们经常会碰到一些以rc结尾的文件:.bashrc, .zshrc, .init.rc, .vimrc 等
- 一般以rc结尾的, 多为配置文件里面包含了软件运行前会去读取并运行的这些初始化的命令
安装一个新的Shell
- 一般,你的linux系统当中大概只安装了以下的几种Shell: sh, csh, bash
- 如果你想要安装另一个Shell,比如 KSH 可以这样安装: $
sudo yum install ksh - zsh 也是一样的安装 $
sudo yum install zsh - 安装好后,要进行切换才能生效,比如执行:$
ksh或 $zsh - 或者使用专门切换shell 的命令 : $
chsh它是 Change Shell 的缩写- 如果当前是 /bin/bash, 你要替换成ksh,要输入
/bin/ksh - 回车即可保存
- 如果当前是 /bin/bash, 你要替换成ksh,要输入
- 为什么切换Shell至关重要呢?
- 因为你的 shell 脚本需要依赖于某一个 shell
- 简单来说,你使用不同的shell,语法其实是不一样的
- 我们可以选择 sh 的一个脚本, 基本可以运行在大多数系统上,但是Sh的这个语法却并不好用
- 我们选择使用bash, 更容易编写,更常用
编写一个Shell脚本
1 )创建脚本文件 vim test.sh
- 注意 sh 就是 shell 的缩写,是一种shell约定俗成的命令惯例
2 )指定脚本要使用的 Shell
- 在写一个 Shell 脚本时,第一要做的事情就是指定要使用哪种Shell 来解析/运行它
- 因为各种Shell语法不尽相同
#!/bin/bash - 这里, #! 被称为 Sha-bang, 或 Shebang
- 这里被指定用 bash 执行
3 )运行命令
- 原则很简单:只需要写入你想要执行的命令
#!/bin/bash ls - 这里这个脚本会列出当前所有文件
4 )注释
- 注释不会被执行,但是用于解释我们的脚本做了什么
- Shell 脚本注释以 # 开头
#!/bin/bash # 列出运行的文件 ls
5 )运行Shell脚本
- 保存上述文件,$
:x - 给脚本添加可执行权限 $
chmod +x test.sh - 运行脚本 $
./test.sh
6 ) 以调试模式运行
- 调试一个脚本程序 $
bash -x test.sh - 参数 -x 表示以调试模式运行
- Shell 就会把我们的脚本文件运行时的细节打印出来了
7 )创建属于自己的命令
- 我们自己的命令和内置的一些命令,如:pwd, ls 等不同的是
- 内置命令在PATH环境中,可以被识别
- PATH变量包含了你系统内所有可被直接执行的程序的路径
- 打印出 PATH 变量:$
echo $PATH - 如果 test.sh 在PATH中的某一个路径中,直接执行 test.sh 即可执行,不用在特定的目录下
- 但是,注意,我们尽可能要保持PATH路径内的整洁,不要乱拷贝东西进去
- 也可以创建软链,这里不做赘述
相关文章:
Linux: Shell编程入门
Shell 编程入门 1 ) Shell 概念 shell 是 在英语中 壳, 外壳的意思可以把它想象成嵌入在linux这样的操作系统里面的一个微型的编程语言不像C语言, C 或 Java 等编程语言那么完整,它可以帮我们完成很多自动化任务例如保存数据监测系统的负载等等,我们同样…...
python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)
文章目录 1、任务目标2、网页分析3、代码编写 1、任务目标 目标网站:B站视频(https://www.bilibili.com/video/BV1se41117WP/?vd_sourcee8e376ccbc5aa4cfd88e6a7917adfd1a),用于本文测验 要求:抓取该网址下的视频&…...
容灾与云计算概念
基础知识容灾备份——备份技术系统架构与备份网络方案-CSDN博客 SAN,是storage area network的简称,翻译过来就是存储区域网络。 顾名思义,SAN首先是一个网络,其次它是关于存储的,区域则是指服务器和存储资…...
基于 Python 的自然语言处理系列(44):Summarization(文本摘要)
在这一部分中,我们将探讨如何使用 Transformer 模型将长文档压缩为摘要,这个任务被称为文本摘要。文本摘要是 NLP 领域中最具挑战性的任务之一,因为它需要理解长篇文本并生成连贯的总结,捕捉文档中的核心主题。然而,当…...
RabbitMQ安装部署
安装Erlang 由于RabbitMQ是用Erlang语言编写的,所以在安装RabbitMQ之前需要安装Erlang 安装依赖 [rootpro-ex ~]yum install make gcc gcc-c build-essential openssl openssl-devel unixODBC unixODBC-devel kernel-devel m4 ncurses-devel设置Eralng的存储库 […...
智联招聘×Milvus:向量召回技术提升招聘匹配效率
01. 业务背景 在智联招聘平台,求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才,求职者则通过上传简历寻找合适的工作。在这种复杂的场景中,我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下,…...
unplugin-auto-import 库作用
unplugin-auto-import是一个 Vite、Webpack 和 Rollup 的插件。 一、自动导入模块 1. 减少手动导入 在 JavaScript 和 TypeScript 项目中,它可以自动检测并导入常用的模块和函数,无需手动在每个文件中进行导入操作。这大大减少了代码中的重复性导入语…...
【Multisim14.0正弦波>方波>三角波】2022-6-8
缘由有没有人会做啊Multisim14.0-其他-CSDN问答参考方波、三角波、正弦波信号产生 - 豆丁网...
vue3纯前端验证码示例
前言 验证码的用途:通过要求用户输入一串难以被机器自动识别的字符或图像,有效阻止恶意用户或脚本通过暴力破解方式尝试登录账户。验证码的分类:常见的验证码有短信、文本、图形等,安全度越高,依赖的插件或服务也越多…...
招聘程序员
全栈总监❤️golang❤️UI设计师 ☀️前端☀️Nodejs工☀️平面设计☀️PHP工 ☀️安卓❤️Flutter❤️运维☀️爬虫 公司福利: ☃️ 带薪年假、年终奖、13k-18k薪 🏩 内宿 2人/间或外宿可补助 💵 转正绩效 ✨节日礼金:生日礼金…...
Android 判断手机放置的方向
#1024程序员节|征文# 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 需求 老板:我有个手持终端,不能让他倒了,当他倒或者倾斜的时候要发出报警; 程序猿:我这..... 老板…...
Telegram机器人的手机部署
目的 一直有读 epub 电子书的习惯,摘录段落复制下来段落很难看,把自己写的排版器的逻辑复制下来,写成了一个排版机器人所有发给机器人的文字,都会经过排版,后转发到读书频道 前提 本来最好方法是直接把机器人架在服…...
ffmpeg视频滤镜: 色温- colortemperature
滤镜简述 colortemperature 官网链接 》 FFmpeg Filters Documentation 这个滤镜可以调节图片的色温,色温值越大显得越冷,可以参考一下下图: 咱们装修的时候可能会用到,比如选择灯还有地板的颜色的时候,选暖色调还是…...
Django+Vue全栈开发项目入门(二)
Vue是一款用于构建用户界面的JavaScript渐进式框架,它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、响应式的、组件化的编程模型,有助于高效地开发用户界面。 环境准备 安装Node.js:Vue项目的构建和运行依赖于Node…...
【ubuntu改源】
ubuntu改源 备份原始源查看ubuntu发行版本arm64 noble版本的源vim修改源更新系统软件源 备份原始源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.disabled查看ubuntu发行版本 lsb_release -aarm64 noble版本的源 清华源 vim修改源 esc :1,$d # 删除所有# 默认注…...
SQLI LABS | Less-9 GET-Blind-Time based-Single Quotes
关注这个靶场的其它相关笔记:SQLI LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 输入下面的链接进入靶场(如果你的地址和我不一样,按照你本地的环境来): http://localhost/sqli-labs/Less-9/ 靶场提示 …...
【小白学机器学习24】 用例子来比较:无偏估计和有偏估计
目录 1 关于无偏估计 1.1 无偏估计的定义 2 原始数据 2.1 假设我们是上帝,我们能创造一个总体/母体 population 2.2 按尽量随机取样的原则去取1个随机样本 sample1 3 一个关于无偏估计的理解 3.1 接着上面的总体和样本 sample1 3.2 左边的计算,期…...
C++在实际项目中的应用第二节:C++与网络编程
第五章:C在实际项目中的应用 第二节:C与网络编程 1. TCP/IP协议详解与C实现 TCP/IP(传输控制协议/互联网协议)是现代互联网通信的基础协议。理解 TCP/IP 协议对于开发网络应用至关重要。本节将详细介绍 TCP/IP 协议的工作原理以…...
依赖关系是危险的
依赖, 我们需要它们,但如何有效安全地使用它们?在本周的节目中,Kris 与 Ian 和 Johnny 一起讨论了 polyfill.io 供应链攻击、Go 中依赖管理和使用的历史,以及 Go 谚语“一点复制胜过一点依赖”。当然,我们用一些不受欢…...
ipguard与Ping32如何加密数据防止泄露?让企业信息更安全
在信息化时代,数据安全已成为企业运营的重中之重。数据泄露不仅会导致经济损失,还可能损害企业声誉。因此,选择合适的数据加密工具是保护企业敏感信息的关键。本文将对IPGuard与Ping32这两款加密软件进行探讨,了解它们如何有效加密…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
