shell 语法介绍

大家好,我是蓝胖子,在日常开发中或多或少都会接触到shell脚本,可以说会shell脚本是一位后端开发的基本功,今天我将会花上一篇文章总结下常见的shell的语法,学完本篇,相信简单的shell脚本就能够看懂了,一些比较高级的语法可以遇到的时候再去学习。

我认为学习一门编程语言语法的时候,最基本的无外乎就是语言中的类型定义,以及循环或if else等跳转指令,懂了这两个以后,便能写一些简单的逻辑了。所以shell语言也不例外,我也会从这两个角度去介绍。

变量定义

首先看下shell中对变量的定义,其中分为环境变量和局部变量。

环境变量在子shell进程中是可见的,可以通过export 关键字进行定义,如下所示,

[root@localhost ~]# export VAR=value

局部变量是指在某个shell中生效的变量,这个变量在其他shell中是无效。

变量的定义

变量的定义可以通过如下方式进行定义,

变量名=变量值,

[root@localhost ~]# name=john 

注意点一:变量名和变量值之间用等号紧紧相连,之间没有任何空格
注意点二:当变量中有空格时必须用引号(单引号,双引号都可以)括起,否则会出现错误

变量的引用

定义了变量,那么如何对其进行引用呢?可以通过如下方式对变量进行引用,

在变量前面加上$ 符号即可。

(base) ➜  ~ name=lanpangzi
(base) ➜  ~ echo $name
lanpangzi

更标准点的写法是用${}将变量名括起来。

(base) ➜  ~ echo ${name}
lanpangzi
位置参数

除了通过${变量名} 方式引用变量,还可以通过 $数字 方式获取shell脚本的参数,$0 代表第一个参数,$1 代表第二个参数,依次类推。 另外 $# 代表参数的个数, $* 或者 $@代表所有参数,例如我写一个脚本 输出这些变量。

脚本如下,

!/bin/sh
echo "第一个参数: $0"
echo "第二个参数: $1"
echo "所有参数: $@"
echo "参数个数: $#"

运行这个脚本

(base) ➜  ~ sh print.sh wudi lanoangzi
print.sh: line 1: !/bin/sh: No such file or directory
第一个参数: print.sh
第二个参数: wudi
所有参数: wudi lanoangzi
参数个数: 2

注意下shell脚本中单引号和双引号的区别,如果要让输出的语句中引用变量,那么要用双引号。

数组的语法

另外,在shell脚本中还有个经常用到的类型,数组,与其他语言不同的是,shell脚本中的数据只支持一维数组。

数组的定义方式如下,

declare 关键字定义数组,其中元素用()括起来,并且元素之间用空格隔开。

declare arr1=(元素1 元素2)

数组中的元素引用方式如下,

echo ${数组名[索引号]}

比较特殊的是可以通过 ${数组名[@]} 或者 ${数组名[*]} 获取数组中的 元素, 可以通过 ${#数组名[@]} 或者 ${#数组名[*]} 获取数组的长度。

对数组中元素替换和新增数组元素可以按如下操作,

对指定位置的变量进行替换

数组名[索引值]=30

假设数组名是arr,对数组末尾进行元素添加,

arr[${#arr[@]}]=30

循环以及判断语句

看了变量的定义,我们再来看看shell脚本中的跳转指令,在学跳转指令前还需要对shell中如何对表达式获取表达式的结果有所了解,因为一般跳转指令都是条件跳转,像if else之类的语句,总有个判断条件。

表达式结果

在shell中可以通过$? 获取上一个shell语句的执行结果,shell命令中规定0才是命令正确执行后的返回结果,其余结果都是不正确的。

让表达式执行比较逻辑的方式有两种,

1, 第一种是通过test expression 的方式,test后面跟表达式,如下所示,比较了两个数字是否相等,返回1说明相等。

(base) ➜  ~ test 1 -eq 2
(base) ➜  ~ echo $?
1

2, 第二种方式是使用[] 把表达式括起来,这种方式注意[] 内变量需要与括号相隔一个空格才行。

(base) ➜  ~ [ 1 -eq 2 ]
(base) ➜  ~ echo $?
1

字符串比较

接着来看下shell中如何对字符串进行比较,

Pasted image 20231113150355.png

字符串的比较是可以用> < 这种符号的,数字则不同。

数字比较

Pasted image 20231113150429.png

文件相关的判断

除了数字和字符串的比较,我们平时还经常会用到对文件的判断,比如判断文件是否存在等,如下是对文件相关操作的判断。

Pasted image 20231113150747.png

if 语句

了解了判断语句就可以看看跳转指令的语法,首先我们看下if语句在shell中是如何写的。

if expression; then 
		command 
fi

通过if then fi三个关键字组成了最简单的if语句,其中expression则是前面讲到的判断语句的表达式,如下,执行这个脚本将会输出,123 和456两行数据。

!/bin/sh
num=1
if test $num -eq 1 ;then
        echo 123
fi
if [ $num -eq 1 ] ;then
        echo 456
fi

if else 语句也类似,它的语法结构如下,

if expression; then 
	command 
else 
	command 
fi

for while循环语句

for 语法结构
for VARIABLE in (list) 
do 
	command 
done

for语句可以遍历一个列表然后对其中每一个元素进行遍历。上述语法中,list既可以是变量也可以是固定数组表达式,也可以命令输出。

案例1,数组变量 循环

!/bin/sh
arr="1 2 3 4"
for num in ${arr}
do
   echo $num
done

案例2,固定数组表达式循环

!/bin/sh
for num in 1 2 3 4
do
   echo $num
done

案例3,命令输出结果 循环

!/bin/sh
for num in $(ls)
do
   echo $num
done
while 语法结构
while expression 
do 
	command 
done

表达式的语法也和之前if 语句那里讲的语法结构类似,这里就不再展开了。

总结

这一节简单的介绍了shell最基本的语法,掌握了这些,便可以简单的写一些最基本的脚本了。函数的声明和调用可以等用到的时候再学,后续也会介绍一些shell脚本的实际案例来巩固下这部分的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp的实战总结大全

&#x1f642;博主&#xff1a;冰海恋雨 &#x1f642;文章核心&#xff1a;uniapp部分总结 目录 ​编辑 目录 前言&#xff1a; 解决方案 1. 跨平台开发 2. Vue.js生态 3. 组件库 4. 自定义组件 5. Native能力 6. 插件生态 7. 性能优化 写法 1. 模板&#xf…

基于范数求解缩放因子方法的MIMO系统预编码技术matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. MIMO系统模型 4.2. 基于范数求解缩放因子的预编码技术 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 。。。。。。。。。。。。。。。…

Hbuilder介绍,uniapp框架

Hbuilder对程序前端页面进行开发&#xff08;包括android&#xff0c;ios&#xff0c;小程序&#xff0c;web等等&#xff09;,其实也就是相当于把android开发进行前后端分离了。方便分工协作。提高开发效率。 用前端框架开发可以实现一次编码&#xff0c;多平台运行。 &…

人工智能极简史:一文读懂ChatGPT的前世今生

2022年11月30日&#xff0c;OpenAI推出的一款人工智能技术驱动的自然语言处理工具——ChatGPT&#xff0c;迅速在社交媒体上走红&#xff0c;短短5天&#xff0c;注册用户数就超过100万。 2023年1月末&#xff0c;ChatGPT的月活用户已突破1亿&#xff0c;一度成为史上增长最快的…

网站定制开发的流程|软件app小程序开发定制

网站定制开发的流程|软件app小程序开发定制 网站定制开发是一个为个体或企业创建定制化网站的过程。它涉及到规划、设计、开发和测试等一系列步骤&#xff0c;以满足客户的需求和目标。下面是网站定制开发的基本流程。 1. 需求分析&#xff1a;首先&#xff0c;与客户沟通并了解…

Netty Review - 快速上手篇

文章目录 基础概念官网Whats NettyWhy NettyAbout Netty Author & LeaderWhat can Netty doNetty开发流程Flow HL View客户端开发Handler客户端启动类 服务端开发Handler服务器端启动类 运行示例 基础概念 BIO、NIO和AIO这三个概念分别对应三种通讯模型&#xff1a;阻塞、…

Docker 中的端口

Docker 中的端口 0.0.0.0:8080->80/tcp &#xff0c;主机&#xff08;即运行 Docker 的机器&#xff09;监听8080端口&#xff0c;如果有请求转发到容器的 80 端口上去。 详细解释一下&#xff1a; 0.0.0.0:8080->80/tcp &#xff1a;这是一个端口映射规则。 0.0.0.0:80…

【C语言 | 指针】C指针详解(经典,非常详细)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Django下的Race Condition漏洞

目录 环境搭建 无锁无事务的竞争攻击复现 无锁有事务的竞争攻击复现 悲观锁进行防御 乐观锁进行防御 环境搭建 首先我们安装源码包&#xff1a;GitHub - phith0n/race-condition-playground: Playground for Race Condition attack 然后将源码包上传到Ubuntu 为了方便使…

软板当然可以弯折啊,只是容易弯出问题而已

高速先生成员&#xff1a;黄刚 每次在介绍具体案例之前&#xff0c;都还是先铺垫下基础知识吧。今天讲的是一个软板的案例&#xff0c;我们循例先介绍下软板的概念。相信大多数的硬件工程师&#xff0c;PCB设计工程师或者测试工程师都见过&#xff0c;就是像下面的这些了。 它作…

openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志

文章目录 openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志118.1 前提条件118.2 背景信息118.3 操作步骤 openGauss学习笔记-118 openGauss 数据库管理-设置数据库审计-维护审计日志 118.1 前提条件 用户必须拥有审计权限。 118.2 背景信息 与审计日…

手写线性表C++ vector

目录 一、vector基本概念 1.1、构造函数 1.2、析构函数 1.3、插入元素 1.4、删除元素 1.5、重载运算符 二、完整代码 一、vector基本概念 C中的vector是一种动态数组&#xff0c;它可以根据需要自动调整大小。vector是C标准模板库&#xff08;STL&#xff09;中的一个容…

海康威视(iVMS)综合安防系统任意文件上传漏洞复现 [附POC]

文章目录 海康威视&#xff08;iVMS&#xff09;综合安防系统任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 海康威视&#xff08;iVMS&#xff09;综合安防系统任意文件上传漏洞复…

中国银行模拟器app,用java设计框架,图片网上找的,提供代码,仅供娱乐

回执单生成器的Java程序需要涉及到一些基本的Java编程技能&#xff0c;包括创建类、处理用户输入和格式化输出。下面是一个简单的示例代码&#xff0c;用于生成一个简易的回执单。这个程序将接收用户的输入&#xff0c;然后生成一个格式化的回执单。 请注意&#xff0c;这个示…

解决Chrome无法自动同步书签

前提&#xff1a;&#xff08;要求能正常访问google&#xff09; 准备一个谷歌账号 安装Chrome浏览器 开启集装箱插件&#xff08;或者其他能访问谷歌的工具&#xff09; 步骤&#xff1a;&#xff08;使用集装箱插件/能正常访问谷歌的其他工具&#xff09; 下载安装使用“集…

Databend 开源周报第 119 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 用户案例&#…

故障演练 | 微服务架构下如何做好故障演练

前言 微服务架构场景中&#xff0c;应用系统复杂切分散。长期运行时&#xff0c;局部出现故障时不可避免的。如果发生故障时不能进行有效反应&#xff0c;系统的可用性将极大地降低。 什么是故障演练 故障演练是指模拟生产环境中可能出现的故障&#xff0c;测试系统或应用在…

HTML简单介绍

且视他人之疑目如盏盏鬼火&#xff0c;大胆地去你的夜路。 目录 1.网页 2.Web标准 3.HTML 3.1HTML结构 3.2HTML标签​编辑 4.标签介绍 4.1排版标签 4.2文本格式化标签 4.3媒体标签 4.3.1图片标签 4.3.2 音频标签 4.3.3视频标签 5.相对路径 6.链接标签 6.1target属…

【赠书第5期】AI时代项目经理成长之道:ChatGPT让项目经理插上翅膀

文章目录 前言 1 ChatGPT为项目经理带来便利 2 提供自动化的通知和提醒 3 提供数据分析和可视化 4 结论 5 推荐图书 6 粉丝福利 前言 在现代商业环境中&#xff0c;项目经理需要具备高度的灵活性和响应能力。而现在&#xff0c;随着技术的不断提升和新工具的涌现&#…