ShellScript脚本编程(一)

什么是Shell

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

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

image-20230620210335278

为什么要学习和使用shell?

Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学(运维人员)

Shell的分类

在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bash/shell( 重 点\默认 ),流行的还有/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/bin/tcsh/bin/csh

查看流行shell

cat /etc/shells 

当前系统使用的Shell

echo $SHELL

Shell脚本入门

文件命名规范

文件名.sh .sh是linux下bash shell 的默认后缀

Shell解析器

指定告知系统当前这个脚本要使用的shell解释器

#!/bin/bash

创建Shell文件

touch hello.sh

编辑Shell文件

#!/bin/bash
echo "Hello World"

执行脚本

bash ./hello.sh
sh ./hello.sh

更简单的执行方式,因为我们知道当前就在bash下面,所以可以直接执行文件

./hello.sh

此时你会发现,报错:-bash: ./hello.sh: Permission denied,这是因为没有权限,我们来查看权限

ll hello.sh # -rw-r--r--. 1 root root 31 Jun 21 05:41 hello.sh

接下来我们给他权限

chmod +x hello.sh

此时你会发现,文件变了颜色,所有可执行文件都会变颜色,变成绿色,执行文件

./hello.sh

扩展执行方案:

  1. source 文件.sh
  2. . 文件.sh

Shell变量_系统预定义变量

运行Shell文件的区别

第一种:bash ./hello.sh 和 sh ./hello.sh

第二种:source hello.sh 和 . hello.sh

两种运行的方式差异性在于,第一种是在子bash环境下运行,而第二种是在当前bash环境下运行,我们通过运行type source可以看到 source is a shell builtin (source 是 shell 内嵌)

我们执行ps -f可以查看当前bash环境,创建一个子bash,继续通过ps -f查看,在当前子bash环境下,你依然可以运行shell文件

从结果上来看,两者好像没有什么区别,但是如果引入更多知识,例如变量:如果子shell中设置的当前变量,父shell是可不见的

变量简介

变量本质上其实是在内存中开辟一个空间用来临时存储数据,例如:age = 20

image-20230621140321383

全局变量和局部变量的区别

image-20230621140656767

全局变量:层层嵌套的子bash依然可以访问

局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问呢

常用系统变量

$HOME 、$PWD 、$SHELL 、$USER

查看当前所有的全局系统变量env

查看当前所有的变量set(包含全局和局部的,系统的,用户的)

Shell变量_用户自定义变量 

基本语法

定义变量:变量名=变量值

规则
  1. 等号前后不能有空格
  2. 在声明变量的时候是不需要添加$符号,但是使用时候需要添加
  3. 如果定义的是一个字符串,需要将值添加双引号或者单引号

温馨提示

查看定义的变量是全局还是局部

全局:env | grep 变量名

局部:set | grep 变量名

当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量

全局变量

如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export导出为一个全局变量

export 变量名

温馨提示

再子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加export也依然不会影响到父bash环境

Shell脚本中使用变量

我们可以在hello.sh的脚本中去调用全局和局部变量

#!/bin/bash
echo $txt

温馨提示

在shell脚本中使用变量,同样遵循全局和局部变量的规则

Shell变量_只读变量和撤销变量

自定义变量注意事项:

  1. 变量命名规范:字母、数字和下划线组成,其中数字不能开头
  2. 自定义变量一般都是小写的
  3. 在shell中,变量是没有类型的,或者我们理解为全部都是字符串类型
  4. 如果变量的值需要做数值运算,可以使用$((1+1))或者$[1+1]的形式

只读变量

在shell中,只读变量相当于是常量,定义之后不允许修改。定义规则

readonly 变量名=值

撤销变量

变量定义之后是可以撤销的,使用unset 变量名就可以撤销了

温馨提示

变量是可以撤销的,但是只读变量是不可以撤销的

Shell变量_特殊变量

在Shell中,存在一些特殊变量,他们具有特殊的意义

$n

$n代表接受参数,n是数字,代表在执行脚本时候传递的参数数量,例如$1-$9代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如${10}。比较特殊的是$0,代表当前脚本名称

#!/bin/bash
echo '======$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $0

$#

$#获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本的健壮性

#!/bin/bash
echo '=====$#====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $#

$*$@

$*$@非常相似,都代表命令行所有的参数,但是$*把参数看成是一个整体,例如123 456。而$@把每个参数区分对待,例如[123,456] 注意:在没有循环遍历时候,两者效果一致

#!/bin/bash
echo '=====$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo '=====$*====='
echo $*
echo '=====$@====='
echo $@

$?

$?最后一次执行命令的状态,如果是结果是0,证明上面执行的命令都是正确的,如果结果不是0(具体是哪个数字,有命令自己决定),则证明上面命令不正确了

[root@localhost scripts]# vim hello.sh
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# hello.sh
-bash: hello.sh: command not found
[root@localhost scripts]# echo $?
127
[root@localhost scripts]# 

Shell_运算符

我们将Shell当成一门编程语言来学习,那么就一定需要有运算符

在Shell中,还存在expr表达式,可以用于做运算

在Shell中,运算需要使用$((a+b))或者$[a+b]的形式

表达式 expr

expr 10 + 10
expr 10 - 10
expr 10 \* 10

温馨提示

运算符前后要添加空格

如何要赋值给一个变量,需要命令替换

a=$(expr 10 + 10)
a=`expr 10 + 10`

$((a+b))或者$[a+b]

$((10+10))
$[10+10]

实例操作

计算 (5+4) * 10 的值

s=$[(5+5)*10]

脚本中操作

创建add.sh,在执行的时候,通过传递参数的形式实现加法效果

#!/bin/bash
sum=$[$1 + $2]
echo sum=$sum

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

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

相关文章

Themis新篇章:老牌衍生品协议登陆Blast L2,探索全新经济模型

本文将深入分析 Themis 的最新经济模型,探讨其核心概念和机制、优势与创新之处、风险与挑战。 一、引言 随着区块链技术的不断发展,DeFi 衍生品项目逐渐成为市场的焦点。而用户体验的革新,进一步的金融创新,去中心化治理方案的优…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试:看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

字节跳动发起AI战争 寻找下一个TikTok

现如今在字节跳动,已近乎隐退的张一鸣,只重点关注两件事:其一,是风暴中的TikTok;其二,就是字节跳动正在全力追赶的AI战略业务。 提及字节的AI战略远望,多个接近字节的人士均认为,以Flow部门出品最为“正统…

pthread线程相关

LWP :轻量级 进程,本质仍是进程 进程 :独立地址空间,拥有PCB 线程:有独立的TCB,但没有独立的地址空间(共享) 区别 :在与是否共享地址文件 进程 (独居)&am…

数据结构:最小生成树(Prim算法和Kruskal算法)、图的最短路径(Dijkstra算法和Bellman-Ford算法)

什么是最小生成树?Prim算法和Kruskal算法是如何找到最小生成树的? 最小生成树是指在一个连通图中,通过连接所有节点并使得总权重最小的子图。 Prim算法和Kruskal算法是两种常用的算法,用于寻找最小生成树。 Prim算法的步骤如下&…

文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作(File类)、文件内容操作(操作字节流、操作字符流) 1.文件类File 1.1.认识File类 (1)什么是File类呢?其实就是可以操作文件的一个类。通过…

C# dateTimePicker控件存取数据库问题

存入数据库时,先设置, dateTimePicker1.Format DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat "yyyy-MM-dd HH:mm:ss"; 然后,dateTimePicker1.Text 就和textBox1.Text一样方式存入数据库;…

【Java EE】Mybatis之XML详解

文章目录 🎍配置数据库连接和MyBatis🍀写持久层代码🌸添加mapper接口🌸添加UserInfoXMLMapper.xml🌸单元测试 🌲CRUD🌸增(Insert)🌸删(Delete)🌸改(Update)🌸…

低空经济+飞行汽车:eVTOL技术详解

低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引,辐射带动相关领域融合发展的综合性经济形态。它广泛体现于第一、第二、第三产业之中,在促进经济发展、加强社会保障、服务国防事业等方面发挥着日益重要的作用。 飞行汽车&#xff0c…

Linux服务器常用命令总结

view查找日志关键词 注意日志级别,回车后等一会儿,因为文件可能比较大加载完需要时间 当内容显示出来后,使用“/关键词”搜索 回车就能搜到,n表示查找下一个,N表示查找上一个 find 查找 find Family -name book …

js APIS part2

什么是事件? 事件是在编程时系统内发生的 动作 或者发生的事情。比如用户在网页上 单击 一个按钮 什么是事件监听? 就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为 绑定事件或者注册…

Python爬取豆瓣电影Top250数据

任务 爬取豆瓣电影top250中的影片名称、影片海报、年份、地区、类型、评分、评价人数、总体评价,并输出到douban_top250.xlsx文件中 环境 Python 3.8 requests bs4 openpyxl 源码 # 创建一个新的Excel工作簿 workbook openpyxl.Workbook() # 获取默认的工作表…

酒水门店私域流量运营搭建执行规划方案

【干货资料持续更新,以防走丢】 酒水门店私域流量运营搭建执行规划方案 部分资料预览 资料部分是网络整理,仅供学习参考。 PPT可编辑(完整资料包含以下内容) 目录 精酿啤酒品牌私域执行运营的内容策划,涉及以下几个…

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要: 尽管 CQT 代币流通供应量增加了 20%(新增 1.04 亿枚 CQT),但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%,多次达到 2.75 亿美元&#xff0c…

全栈开发之路——前端篇(4)watch监视、数据绑定和计算属性

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 辅助文档:HTML标签大全(实时更新&#xff…

Python | Leetcode Python题解之第64题最小路径和

题目: 题解: class Solution:def minPathSum(self, grid: List[List[int]]) -> int:if not grid or not grid[0]:return 0rows, columns len(grid), len(grid[0])dp [[0] * columns for _ in range(rows)]dp[0][0] grid[0][0]for i in range(1, r…

All In ai,Oracle 23C没了,等来了Oracle 23ai

今年一月份的Blog介绍Oracle命名规则的时候,说到Oracle的命名是紧紧跟随时代浪潮的前言科技的,在文章的最后还大胆预测也许Oracle的下一个版本就叫25A了,结果Oracle根本等不及,把原来已经海量宣传的Oracle 23C直接改名为23ai&…

分布式与一致性协议之Raft算法(四)

Raft算法 Raft是如何解决成员变更问题的 在日常工作中,你可能会遇到服务器故障的情况,这时你需要替换集群中的服务器。如果遇到需要改变数据副本数的情况,则需要增加或移除集群中的服务器。总的来说,在日常工作中,集…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验:搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块,如…

AI时代,如何让ChatGPT成为你最好的编程老师|TodayAI

ChatGPT作为生成式预训练变换器(GPT)系列模型的一种,专门设计用来理解和生成文本,其生成的文本能够高度模仿人类的对话方式。这种能力不仅让它在进行日常对话时表现得像极了真人,还使其在各种专业领域内,比…