Linux: Shell编程入门

news2024/10/28 7:54:04

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
    • 回车即可保存
  • 为什么切换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路径内的整洁,不要乱拷贝东西进去
  • 也可以创建软链,这里不做赘述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB生物细胞瞬态滞后随机建模定量分析

&#x1f3af;要点 基于随机动态行为受化学主方程控制&#xff0c;定量分析单细胞瞬态效应。确定性常微分方程描述双稳态和滞后现象。通过随机性偏微分方程描述出暂时性滞后会逐渐达到平稳状态&#xff0c;并利用熵方法或截断方法计算平衡收敛速度的估计值。随机定量分析模型使…

什么是字节序、大小端、高低字节、高低地址?

目录 1. 什么是字节序&#xff08;Endianness&#xff09;&#xff1f; 2. 什么是大小端&#xff08;Big-Endians and Little-Endian&#xff09;&#xff1f; 3. 什么时候需要用到大小端的概念&#xff1f; 4. 如何确认系统的大小端模式&#xff1f; 5. 什么是大小端定义…

[LVGL] MessageBox

该例子用lvgl9 来测试&#xff0c;对话框从底部升上来。当点击关闭或者确认按键时&#xff0c;会向绑定对象发送按键事件&#xff0c;参数 100/101. /*** file lv_demo_test.c**/#include "stdio.h" #include "stdlib.h" #include "lvgl.h"#ifde…

985研一,转嵌入式好还是后端开发好?

有个老铁问&#xff0c;985研一&#xff0c;转嵌入式好还是后端开发好&#xff1f; 我认为&#xff0c;这学历&#xff0c;两个随便挑&#xff0c;我说的&#xff0c;从趋势来看&#xff0c;更建议嵌入式&#xff0c;走供应链上游&#xff0c;芯片原厂、新能源车企、军工或者搞…

IDEA自动生成时序图插件-SequenceDiagram

目录 前言介绍安装在线安装离线安装 使用基本使用使用技巧 知识扩展为什么要画时序图&#xff1f;为什么要使用SequenceDiagram插件&#xff1f; 前言 工欲善其事&#xff0c;必先利其器&#xff0c;用对工具&#xff0c;事半功倍。我向大家介绍一款卓越的插件——Sequence Dia…

衡石分析平台系统分析人员手册-展示类控件创建富文本攻略

富文本​ 富文本控件是一种常见的控件&#xff0c;可用来展示文本信息、用户属性信息&#xff0c;在数据分析中起到辅助分析的功能。 富文本常见的使用场景有&#xff1a; 仅展示纯文本信息。在富文本中展示数据集字段、指标、参数等信息。使用富文本展示用户属性相关信息。在…

H3m-Blog

H3m-Blog 一、项目介绍 1.1 项目介绍 一个基于SpringBoot和Vue3的博客系统&#xff0c;博客名称来源于陈奕迅于2009年发布的粤语专辑《H3M》 1.2 技术架构 主要技术栈&#xff1a; SpringBoot2 Vue3 MySQL8.0 1.3 主要功能 内容丰富&#xff0c;尽情体验~ 二、快速开始…

Win11安装基于WSL2的Ubuntu

1. 概述 趁着还没有完全忘记&#xff0c;详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了&#xff0c;还是很值得安装和使用的&#xff0c;笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装 在Win11搜…

【HarmonyOS NEXT】使用 Navigation 对折叠屏设备页面进行分栏展示,优化 UI 交互

关键词&#xff1a;折叠屏、navigation、router、路由、分栏、UI 随着科技的发展&#xff0c;手机设备形态也由一面屏向多面屏进行发展&#xff0c;那么软件的UI适配也面临着问题&#xff0c;本篇文章主要解决大屏设备的页面 UI 适配问题&#xff0c;如折叠屏&#xff0c;平板&…

MySql数据库中数据类型

本篇将介绍在 MySql 中的所有数据类型&#xff0c;其中主要分为四类&#xff1a;数值类型、文本和二进制类型、时间日期、String 类型。如下&#xff08;图片来源&#xff1a;MySQL数据库&#xff09;&#xff1a; 目录如下&#xff1a; 目录 数值类型 1. 整数类型 2. …

[MoeCTF 2022]endian

查看发现是64位文件&#xff0c;且看到了amd64-64-little&#xff08;这里是小端序&#xff09; 所以我们要反向输入 对于整数 0x12345678&#xff0c;在小端序存储下的内存布局为&#xff1a; 地址 内容 低地址 0x78 0x56 0x34 高地址 0x12 查看main函数&#xff0c…

Python4

4. 更多控制流工具 除了刚介绍的 while 语句&#xff0c;Python 还用了一些别的。我们将在本章中遇到它们。 4.1. if 语句 if elif else if x<0: x 0 print(Negative changed to zero) elif x0: print( zero) else: print(More) 4.2. for 语句 Pyth…

游戏服务器被攻击有办法防护吗

游戏服务器受到攻击时比较常见的。就算是刚上线的游戏&#xff0c;都会有被攻击的时候。游戏服务器受到攻击的原因以及解决方案有哪些呢&#xff1f; 游戏服务器被攻击的原因有哪些呢&#xff1f; 1、常见的攻击&#xff0c;大部分来自于同行之间的恶意竞争&#xff0c;你的游…

Rust 力扣 - 3. 无重复字符的最长子串

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们需要记录当前子串的开始下标&#xff0c;一个哈希表记录字符和遍历过程中最后一次出现的索引 遍历字符串&#xff0c;如果在当前字符在哈希表中有记录&#xff0c;并且索引下标大于当前子串的开始下标&…

Lesson12---queue

Lesson12—queue 本篇博客介绍了cqueue的介绍使用以及模拟实现 文章目录 Lesson12---queue前言一、queue的成员函数1 queue2.empty3.size4.front5.back6.push7.pop 二、相关题目三、模拟实现完整代码 四、deque&#xff08;双端队列&#xff09;总结 前言 queue的文档:https:…

go高并发之路——本地缓存

一、使用场景 试想一个场景&#xff0c;有一个配置服务系统&#xff0c;里面存储着各种各样的配置&#xff0c;比如直播间的直播信息、点赞、签到、红包、带货等等。这些配置信息有两个特点&#xff1a; 1、并发量可能会特别特别大&#xff0c;试想一下&#xff0c;一个几十万…

CANopen中错误帧的制造和观测

本文讲述如何制造和观察CANopen中的错误帧&#xff08;Error frame&#xff09;&#xff0c;以Linux下的“VCAN0”为CAN接口来做测试&#xff0c;所以事先要先创建vcan0 一 制造错误帧 首先安装python CAN&#xff0c; pip3 install python-can然后参考python can的文档编写如…

Android View

前面我们了解了Android四大组件的工作流程&#xff0c;Android中还存在一个和四大组件地位相同的概念&#xff1a;View&#xff0c;用于向用户页面展示内容。我们经常使用的TextView、Button、ImageView控件等都继承于它&#xff0c;也会自定义View实现自定义效果。View类源码内…

2024CSP-J题目简析

扑克牌 1.题目大意&#xff1a;给定n张扑克牌和这n张扑克牌的花色和大小&#xff08;可能会有重复&#xff09;&#xff0c;需要输出还需要多少张牌才能凑齐一副扑克牌&#xff08;这里不考虑大小王&#xff0c;所以共52张&#xff09;。 2.思路概要&#xff1a;由于扑克牌会…

C++ | Leetcode C++题解之第513题找树左下角的值

题目&#xff1a; 题解&#xff1a; class Solution { public:int findBottomLeftValue(TreeNode* root) {int ret;queue<TreeNode *> q;q.push(root);while (!q.empty()) {auto p q.front();q.pop();if (p->right) {q.push(p->right);}if (p->left) {q.push(…