Linux--shell脚本语言—/—<1>

news2024/9/24 5:30:16

一、shell简介

        Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支

        Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。它既是一种命令语言,又是一种程序设计语言。以下是一些Shell编程的常见用途:

         自动化任务:使用Shell编程可以编写脚本来执行一系列的任务,如备份文件、定时执行任务、自动化测试等。

        • 系统管理:通过Shell编程可以管理系统的各种配置和操作,如安装软件、配置网络、管理用户等。

        • 数据处理:Shell编程提供了对文本文件的强大处理能力,可以通过脚本来处理和分析数据,如提取特定的信息、转换数据格式等。

        • 系统监控:使用Shell编程可以编写脚本来监控系统的运行状态,如CPU使用率、内存占用等,并根据条件执行相应的操作。

        • 安全管理:通过Shell编程可以编写脚本来执行一系列的安全管理任务,如检查和修复系统漏洞、监控日志等。

二、Shell环境

        Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

        Linux 的 Shell 种类众多,常见的有:     Bourne Shell(/usr/bin/sh或/bin/sh)、 Bourne Again Shell(/bin/bash) 、C Shell(/usr/bin/csh)、 K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)          

        在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。 #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

三、实操shell脚本

        例如在虚拟机内部的终端环境下,使用命令vim a.sh 生成并打开sh脚本文件编辑模式,其后缀名用sh表示其为脚本代码,在其中写入脚本代码如下,然后点击esc输入冒号+wq保存退出

其中的#!bin/sh 或者#!bin/bash是一条提示信息,它是用于指定脚本文件使用的Shell解释器,如果脚本文件开头是 "#!bin/sh",那么当你执行这个脚本时,系统会自动查找并使用 "/bin/sh" 解释器来执行脚本中的命令。

运行脚本语言,使用命令sh a.sh,以sh命令来指示其为脚本文件,其输出结果如下

        注:在虚拟机内运行不美观不好用,所以我就使用vscode 编辑器,但是不能使用版本太新的,因为我使用的是centos开发版,它停止维护了,所以新版本的vscode不能对其进行远程连接,老版本的可以连接。

        使用命令 chmod +x ./a.sh ,给脚本文件a.txt的每个用户都增加执行权限,再使用./a.sh执行脚本

        注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找

        作为解释器参数: 这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

四、基础语法

1、shell变量

        变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则

        在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。 这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。例如在C语言或者 C++ 中,变量分为整数、小数、字符串、布尔等多种类型。当然,如果有必要,你也可以使用 Shell declare 关键字显式定义变量的类型,但在一般情况下没有这个需求,Shell 开发者在编写代码时自行注意值的类型即可。

2、变量的三种定义方式

        • variable=value 直接写

         variable='value' 用单引号括起来,此时内部如果有转义字符也会被当成字符直接输出

        • variable="value" 用双引号括起来,内部如果有转义字符,会被识别为转义字符输出

例如:定义几个变量,其中echo可以看成是print,$符用来指示后面的字符串是变量,而不是一个单独的字符串

        

其打印结果为:

3、Shell 变量的命名

        规范和大部分编程语言都一样: 变量名由数字、字母、下划线组成; 必须以字母或者下划线开头; 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

4、使用变量

使用一个定义过的变量,只要在变量名前面加美元符号$即可,如:

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

        如果不给 skill 变量加花括号,写成echo "I am good at $skillWeb",解释器就会把 $skillWeb 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

5、修改变量值

已定义的变量,可以被重新赋值,如:

第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。

6、单引号和双引号的区别

        定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:

其输出结果为:

        以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。        

        以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

7、将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

         variable=`Shell` 用反应号括起来

        variable=$(Shell)

        第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;

        第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

8、只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

面的例子尝试更改只读变量,结果报错

其作用为,先定义一个变量myurl,然后使用命令readonly将更改为只读变量,后面一条命令为重新为变量myurl赋值,但是前面已经定义它为只读变量了,所以结果报错:

9、删除变量

使用unset命令删除变量,其语法如下:

变量被删除后不能再次使用;unset 命令不能删除只读变量

例如:

定义变量mrurl后使用unset删除,后面再使用echo打印这个变量,结果为空:

10、shell传递参数

        我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

代码文件内容为这段

使用终端直接运行文件时需在后面加上参数数据,其输出结果如下:

因为系统会识别第一条文件名当做第0条参数,所以使用了$0将其打印出来,$1代表第一个参数,$2代表第二个参数.....

即如果将$0注释了,得到如下结果

1、特殊字符处理参数说明:

例如:

执行脚本:

其输出结果为:

                ​​​​​​​    

2、$* 与 $@ 区别:

相同点:都是引用所有参数。

不同点:只有在双引号中体现出来。

        假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

例如:

 

$*相当于将所有参数以一个字符串的形式输出,而$@则将所有参数以一个一个的字符串分别输出

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

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

相关文章

【practise】大数相加、大数相乘

通常,我们的int、long long类型都有最大的数字上限,也就是说再大了会有溢出问题,那么很大的数字是怎么进行运算的呢? 其中一种方法是把很大的数字转变成字符串存放到string中,然后用代码对字符串进行处理,…

PHP最新可用获取QQ昵称API接口源码_非第三方

PHP最新可用获取QQ昵称API接口源码,运行环境为php7-8都可以,内容为直接调用QQ空间接口 在需要展示QQ昵称处,直接调用以下函数就可以。 例如:get_qq_nick(123456)就会直接输出123456的qq号昵称。 API源码下载:QQ昵称AP…

【C语言】字符函数和字符串函数详解

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 内容一览 一、strlen …

一拖三无线充底座-带给你极致的便利生活

随着科技的不断进步,无线充电技术已经逐渐渗透到我们日常生活的方方面面,一拖三无线充底座作为其中的佼佼者,以其高效、便捷的特点受到广大用户的青睐。本文将从电磁感应原理、多线圈设计、频率匹配、电能传输、功率分配以及充电管理六个方面…

【Rust日报】终端表格查看工具

[new ver] Tabiew v0.6.1 Tabiew 是一个轻量级的、基于终端的应用程序,用于查看和查询分隔符分隔值格式的文档,例如 CSV 或 TSV 文件。 功能如下: 📊 表格视图: 通过易于导航的表格视图来探索数据。🔍 工作表视图: 深入…

深入剖析隐私安全测试:在数字化时代的守护者

大家好,我是一名_全栈_测试开发工程师,已经开源一套【自动化测试框架】和【测试管理平台】,欢迎大家关注我,和我一起【分享测试知识,交流测试技术,趣聊行业热点】。 一、引言 在日新月异的数字化浪潮中&…

FPGA开发——基于Quartus的工程建立以及下载仿真全过程

一、概述 在使用了这么久的FPGA之后,才发现前面光发了各个设计的设计文件和测试问价,还没有发过怎么利用我们编写的代码进行仿真和使用软件进行工程建立和下载验证的过程,今天就补发一篇Quartus的工程建立以及下载仿真全过程。 二、文件夹建…

程序执行的环境和预处理

目录: 思维导图 一 程序的翻译环境 二 程序的执行环境 三 C 语言程序的编译和链接 四 预定义符号 五 预处理指令 六 宏和函数对比 七 预处理操作符# 和 ## 八 命令定义 九 预处理指令#include 十 预处理指令#undef 十一 条件编译 WeChat_2024073122290…

JavaScript 打印 V 和倒 V 图案的程序(Program to print V and inverted-V pattern)

倒 V 型模式:给定 n 的值,打印倒 V 型模式。示例: 输入:n 5 输出 : E D D C C B B A A 输入:n 7 输出 : G F F E E D D C C B B A…

中药养发护发

按照中医理论,头发和肝肾有密切联系,肝主血,肾藏精, 其华在发,肝肾强健,上荣于头,则毛发乌黑浓密. 中药育发的应用 以当归,天麻,桑疹子养血润发,配合干姜祛风活血,能通畅经络, 加快循环,激活毛囊,能促进皮肤组织营养成分吸收和废弃物的排泄,改善 头发生态. 用苦参 皂角 清热化…

yum仓库的制作与使用

目录 前言: 1 查看系统内核 2 获取网络源 3 搭建yum网络仓库 4 rpm包的下载 4.1 将rpm包下载至本地 4.2 对下载的rpm包进行备份 5 制作本地yum源 5.1 软件仓库制作工具createrepo 5.2 使用createrepo创建本地yum仓库 6 搭建docker本地仓库 前言&#x…

【Dash】使用 HTML 和 CSS 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…

Scalable Diffusion Models with Transformers(DIT)代码笔记

完整代码来源:DiT DiT模型主要是在diffusion中,使用transformer模型替换了UNet模型,使用class来控制图像生成。 根据论文,模型越大,patch size 越小,FID越小。 模型越大,参数越多,pa…

3.罗马数字转数字

3.罗马数字转数字 题目题目分析 题目 题目分析 基础思路是先想到键值对,然后遍历字符串利用键值对匹配来计算值,要注意处理IV,IX之类需要将当前处理字符与前一个字符进行比较。 class Solution { public:int romanToInt(string s) {//这个函…

项目负责人视角:结构化思考在竞赛中的力量

项目负责人视角:结构化思考在竞赛中的力量 前言结构化思考的定义与重要性结构化思考的五个关键步骤1. 明确问题2. 问题分解3. 优先级排序4. 制定行动计划5. 执行与监控 结构化思考的实际应用案例结语 前言 在这个充满挑战和机遇的时代,项目管理已成为企业…

Nero Lens 智图 - 适用于 iOS 和 iPadOS 的专业图片处理 App

首先是手机端的无损放大 App:Nero Lens 智图,适用于 iOS 和 iPadOS,不仅可以放大,还有多种 AI 图片增强功能。 使用这款 App 可以通过 AI 模型智能放大可达 400%,还有老照片去划痕、上色,抠图移除背景、照…

数论第四节:不定方程(习题)

文章目录 例1例2例3例4例5 例1 解下列不定方程: ( a ) 15 x 25 y 100 (a)15x25y100 (a)15x25y100 ( b ) 306 x − 360 y 630 (b)306x-360y630 (b)306x−360y630 (a)解: (15,25)5,且5|100,所以方程有解。 方程两边同时除以(15,24)&…

53 SSLVPN IP 接入

(1) 配置接口IP地址 # 根据组网图中规划的信息,配置各接口的IP地址,具体配置步骤如下。 <Device> system-view [Device] interface gigabitethernet 1/2/5/1 [Device-GigabitEthernet1/2/5/1] ip address 1.1.1.2 255.255.255.0 [Device-GigabitEthernet1/2/…

Unity获取Animator动画播放完成事件

整理了一些在日常经验中处理动画播放完成事件的方法 方法: 1.Dotween配合异步实现 2.状态机计时方法实现 3.原生动画行为方法实现 方法一&#xff1a;Dotween异步方法 using UnityEngine; using System.Threading.Tasks; using DG.Tweening;public class PlayerAnimAsync : M…

从Excel高手到SQL大师-解锁数据分析的无限潜力 -10分钟读懂职场必备技能

目录 Excel 和 SQL&#xff1a;看似相似却大不相同的数据处理利器Excel vs SQL&#xff1a;表面相似&#xff0c;本质迥异Excel&#xff1a;直观但受限的电子表格SQL&#xff1a;强大而灵活的数据库查询语言 从 Excel 到 SQL&#xff1a;跨越鸿沟Excel 数据筛选SQL 数据筛选 结…