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
    • 回车即可保存
  • 为什么切换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.rhkb.cn/news/457770.html

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

相关文章

AI博士人手10篇顶会,遭质疑。。。

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI科技圈又发生了啥新鲜事&#xff1f; “稚晖君”灵犀X1全球开源&#xff0c;推动人形机器人技术共享 智元机器人宣布其人形机器人灵犀X1正式面向全球开源&#xff0c;提供了超过1.2GB的软硬件全套…

【LeetCode】11.盛最多水的容器

思路&#xff1a; 利用双指针法进行移动&#xff0c;一个在头一个在尾&#xff0c;此时宽度最宽&#xff0c;当宽度缩小时&#xff0c;高度发生变化&#xff0c;从而可以找到最大值。 代码&#xff1a; int maxArea(int* height, int heightSize) {int* left height;int* …

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

Java常见数据结构

数组 数组的特性存储空间是连续的长度是不可变的只能存储 相同的类型(不严谨)可以通过下标访问数组的内容 a[10] 复杂度是O1每个元素的默认是为零值 0 null false -> 一个对象的基本的数据域的初始化也是这样的 Student 类中的username属性 默认值 链表 查找麻烦 插入和删…

logback日志导入使用

1导入配置 <!-- 日志 &#xff0c; 会自动传递slf4j门面--> <dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version> </dependency>2 引入配置 Logback要求…

开源实时数仓的构建

设计计思路 基本思路 开源数据平台的设计思路是通过 Flink SQL Batch、StartRocks SQL 、StartRocks物化视图 的能力实现一个离线任务的开发&#xff1b;使用 DolphinScheduler 进行离线工作流编排和调度&#xff1b;通过 Flink CDC 和 Flink SQL 实现流处理能力&#xff0c;进…

HarmonyOS 相对布局(RelativeContainer)

1. HarmonyOS 相对布局&#xff08;RelativeContainer&#xff09; 文档中心:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-layout-development-relative-layout-V5   RelativeContainer为采用相对布局的容器&#xff0c;支持容器内部的子元素设…

【C++】—— 模板进阶

【C】—— 模板进阶 1 非类型模板参数1.1 什么是非类型模板参数1.2 非类型模板参数对比宏的优势1.3 array 简单了解 2 模板的特化2.1 引子2.2 函数模板特化2.3 函数模板特化的坑2.4 类模板的特化2.4.1 全特化2.4.2 偏特化&#xff08;半特化&#xff09;2.4.3 选择2.4.4 偏特化…

英伟达GPU算力【自用】

GPU&#xff08;图形处理单元&#xff09;算力的提升是驱动当代科技革命的核心力量之一&#xff0c;尤其在人工智能、深度学习、科学计算和超级计算机领域展现出了前所未有的影响力。2024年的GPU技术发展&#xff0c;不仅体现在游戏和图形处理的传统优势上&#xff0c;更在跨行…

unity项目导出安卓工程后,在AndroidStudio打包报错:unityLibrary:BuildIl2CppTask‘.

下面这个是我在unity开发者社区提问后&#xff0c;他们回答得&#xff1a; 解决方案&#xff1a;我这边按照这几个方案检查了下&#xff0c;NDK和JDK都没问题&#xff0c;最后重启电脑才解决的&#xff0c;应该是文件被锁定了&#xff0c;我用的windows系统的。 验证&#xff…

书生第四期作业:L0G1000 任务作业

永不止步&#xff0c;空杯心态&#xff0c;从零开始&#xff0c;复习一下&#xff0c;争取完成全部任务 SSH登录 PowerShell命令行登录成功 VScode SSH登录成功 进入root文件夹 闯关任务&#xff1a;映射运行hello_world.py 可选任务1&#xff1a;linux命令行基本命令过一边 …

【WPF】中Dispatcher的DispatcherPriority参数使用

在 WPF 中&#xff0c;DispatcherPriority 参数用于指定通过 Dispatcher 调度的操作的执行优先级。加入 DispatcherPriority 参数的情况通常取决于你希望操作何时以及如何被执行。 1.Dispatcher的DispatcherPriority参数使用 以下是几种情况和示例说明&#xff1a; 1.1 需要…

C++——String类讲解

一. 为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需…

【C语言刷力扣】1768.交替合并字符串

题目&#xff1a; 解题思路&#xff1a; 将 word1 和 word2 元素依次添加至 ans 的后面。 时间复杂度&#xff1a; &#xff0c; n是word1的长度 m是word2的长度 空间复杂度&#xff1a; char* mergeAlternately(char* word1, char* word2) {int len1 strlen(word1);in…

009:屏幕录制软件FastStoneCapture9.5安装教程

摘要&#xff1a;本文详细介绍屏幕录制软件FastStoneCapture9.5的安装流程。 一、软件介绍 FastStone Capture是一款集屏幕捕获、编辑、注释与分享于一体的高性能工具&#xff0c;支持多种截图方式、高质量的图像输出以及便捷的录屏功能&#xff0c;适用于教育培训、工作辅助和…

代码随想录算法训练营第46期Day37,38,39,41

这几天晚上看比赛&#xff0c;就把刷题耽误了。还好是开新章节&#xff0c;前面的题都比较简单。 然后周天做完了又忘记发了 动态规划 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数 Day37前两道题太简单…

ThinkPad T480拆机屏幕改装:便携式显示器DIY指南

ThinkPad T480拆机屏幕改装&#xff1a;便携式显示器DIY指南 本文记录了将旧笔记本电脑 T480 拆机屏幕改装为便携式显示器的全过程。作者在决定升级设备后&#xff0c;选择通过 DIY 方式利用原有的屏幕资源。文章详细介绍了屏幕驱动板的安装、螺丝孔的剪裁、排线连接及固定的步…

vue面试题+wx-open-launch-app开放标签唤醒app方法

vue面试题 核心原理部分 mvc mvvm和mvp的区别&#xff1f; MVVM 就是 Model-View-ViewModel 的缩写&#xff0c;MVVM 将视图和业务逻辑分开。 View&#xff1a;视图层&#xff0c;Model 数据模型&#xff0c;而 ViewModel 是把两者建立通信的桥梁。 在 MVVM 框架下&#…

基于Spring Boot的装饰工程管理系统源码(springboot)

项目简介 基于Spring Boot的装饰工程管理系统实现了以下功能&#xff1a; 系统可以实现合同信息管理&#xff0c;合同报价管理&#xff0c;客户管理&#xff0c;立项项目管理&#xff0c;公告信息管理&#xff0c;员工管理&#xff0c;预算报价管理&#xff0c;装饰材料总计划…

react18中的合成事件与浏览器中的原生事件

React 通过将事件 normalize 以让他们在不同浏览器中拥有一致的属性。 合成事件 SyntheticEvent 实例将被传递给你的事件处理函数&#xff0c;它是浏览器的原生事件的跨浏览器包装器。除兼容所有浏览器外&#xff0c;它还拥有和浏览器原生事件相同的接口&#xff0c;包括 stopP…