【shell漫步】1 变量定义和使用

碎碎念

转眼间已经使用了一个月的shell了,作为一个纯小白,我特别理解刚入门的时候对于linux和shell一头雾水的状态,尤其是打算开始学,但是又找不到学习的“入口函数”的那种感受。所以打算整理一下shell的骨架。shell给我的感触就是:重要的是骨架,所有的工具都是可以替换的模块

所以这个系列的目的是从一个小白的视角开始,整理自己这一个月来的shell漫步日记:

1 先在不知道全体像的情况下学会shell语言

2 了解一些常用的linux命令,进而了解shell在linux系统中发挥的作用

3 最后回到shell本身来,许多第一阶段的伏笔都会在最后一个阶段云开日明

变量格式

shell中的基本数据格式只有三种:数字,文本,数组(或者列表)

数字和文本就很好区分,要注意的是数组,shell的数组不支持多维数组的写法,数组用括号表示,数组元素之间用空格分割

比如(1 2 3)这就是一个数组,数组中的元素就是1,2和3,不过数组元素不仅可以是数字,还可以是文本

变量的定义

在shell中除非直接利用数字,文本或者数组进行操作

比如  echo "hello"

只要是想重复使用的数据都应该用变量的形式保存在内存中以供重复调用,以上述的echo "hello"为例,可以直接使用hello这一文本数据格式,但是如果要在项目中使用100次呢,重复写相同的文本是一件低效率的事情,除此以外如果需要把所有的hello都改成halo,手动修改100次而且项目位置都不一样,这就更加抓狂了,所以需要把数据以变量的形式声明

而在shell中声明变量的方法非常简单,就是 

变量名=数据 (等号两边没有空格,shell对空格敏感

echo 可以把一个变量的值输出出来

当数据是数字和文本的时候直接给他赋值就行

当数据是数组的时候就用括号把数组元素括起来,然后在里面用空格分割数组元素

以下写法都是可以执行的

money=100
name="me"
name='me'
name=me
pets=("dog" "cat")
pets=('dog' 'cat')
pets=(dog cat)

同样是字符串的赋值,不带引号和带单引号,双引号有什么区别?

最简单的就是单引号的情形,在单引号中的内容所见即所得,单引号中不管多离谱的文本都会被原样保留并且输出

不带引号和带双引号的情形都会对其中的特殊符号进行解析,比如空格,& # $ %等等,带双引号类似于给字符串规定了一个边界,在这个边界之内都是字符串的内容,不过不带双引号的话,遇到空格有可能被解析为一个整体,有可能被解析为好几个部分(上面提到的数组是通过空格分割的,所以在对一个函数进行传参的时候,计算机也难以理解人类的本意,究竟是要把空格当成字符串的一部分还是作为参数分割的依据呢?)

结果也非常明显,所以字符串一般都推荐使用引号进行包裹才能够正确按照使用者的意志执行,尽管文件夹可以使用空格,但怎么看还是有点别扭

变量的使用

定义后的变量肯定是要在某个地方进行使用的,shell中以  $  符号作为变量引用的标志,针对三种基本数据类型:

引用数字和字符串的时候直接  $ 加上 变量名即可

重要的是数组,首先数组的写法就不一样

$ { 变量名 [ 索引值 ] } 

并且在不同的shell版本中,索引值的起始位置也不同,在几乎所有linux发行版中都默认使用bash,bash的索引是从0开始数的,例如 arr=(a b c),则 ${ arr [ 0 ] } 的结果是a

截止发稿的今天,在macos中,文件中默认使用的解释器仍然是 /bin/bash 但是在命令行中默认使用 /bin/zsh解释器,而zsh的索引是从1开始的,例如  arr=(a b c),则 ${ arr [ 1 ] } 的结果是a,这些可以很容易验证

索引0为空,但是如果是写在shell脚本文件中的话,默认仍然使用/bin/bash作为解释器

pets=(dog cat)
echo "${pets[0]}"

变量名的命名规则

变量的命名规则是大小写敏感的

可以使用  a-z A-Z 0-9  以及下划线( _ )作为命名字符

但是不能以数字开头

并且不能使用关键字( if else return exit ... )

实际上关键字仍然可以用作变量命名,但是保持代码规范可以避开意料之外的风险(不要拿项目开玩笑,由于不遵守基本规范而出问题真的很费时费力)

祝大家玩得开心

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

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

相关文章

【C#】知识点实践序列之UrlEncode在线URL网址编码、解码

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是2024年第8篇文章,此篇文章是C#知识点实践序列文章, 博主能力有限,理解水平有限,若有不对之处望指正! 地址编码大家应该比较经常遇到和使用到&…

记一次使用mpvue开发微信小程序动画播放播放完成再播放下一个动画,实现动画队列的实战操作

微信小程序wxss支持Css的keyframes动画,我们想通过事件监听,在动画开始、动画播放阶段、动画播放结束的时候进行下一步动作。如下图,有一个从右飘入,然后从左侧出去的动画,我们希望的是,前一个出去后&#…

微众区块链观察节点的架构和原理 | 科普时间

践行区块链公共精神,实现更好的公众开放与监督!2023年12月,微众区块链观察节点正式面向公众开放接入功能。从开放日起,陆续有多个观察节点在各地运行,同步区块链数据,运行区块链浏览器观察检视数据&#xf…

STM32 内部 EEPROM 读写

STM32 的某些系列 MCU 自带 EEPROM。笔者使用的 STM32L151RET6 自带 16 KB 的 EEPROM,可以用来存储自定义的数据。在芯片选型时,自带 EEPROM 也可以作为一个考量点,省去了在外接 EEPROM 的烦恼。 下面简单介绍下 STM32 内部 EEPROM 的读写流…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第一套区块链系统部署与运维

第一套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 子任务1-2-1: 搭建区块链系统并验证 题意: 要求搭建一条四节点的区块链系统,我们选择使用fisco作为此次测试的链子 我们使用build_chain.sh进行构建单机四节点,并且使用官方的默认端口【正式比赛大概率不…

Python 操作 JMeter 探索:pymeter 实操指南

概要 JMeter 是一个流行的性能测试工具,用于测试 Web 应用程序的性能和负载。它通常与 GUI 一起使用,但如果您想在自动化测试中集成 JMeter,或者以编程方式创建和运行测试计划,那么 pymeter 库将是一个强大的工具。本文将介绍如何…

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法, 附带应用脚本

介绍 viralcc是一个基因组病毒分析工具,可以用于快速、准确地检测和分类病毒序列。 github:dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…

大数据StarRocks(三) StarRocks数据表设计

1. 列式存储 1.1 列式存储方式有以下几个优点: 1.快速的数据查询 由于数据是按照列进行存储的,所以查询某个列时只需要读取该列所在的块,而不是整行数据,从而大大提高了查询效率。 2.压缩效率高 由于列式存储的数据块中只有一…

LLM Agent之再谈RAG的召回信息密度和质量

话接上文的召回多样性优化,多路索引的召回方案可以提供更多的潜在候选内容。但候选越多,如何对这些内容进行筛选和排序就变得更加重要。这一章我们唠唠召回的信息密度和质量。同样参考经典搜索和推荐框架,这一章对应排序重排环节,…

Flink实时电商数仓之旁路缓存

撤回流的处理 撤回流是指流式处理过程中,两表join过程中的数据是一条一条跑过来的,即原本可以join到一起的数据在刚开始可能并没有join上。 撤回流的格式: 解决方案 定时器:使用定时器定时10s(数据最大的时间差值&am…

【数据结构—二叉树的链式结构实现】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、二叉树的存储结构 二、二叉树链式结构的实现 2.1手动构建一课树 2.2二叉树的遍历 三、二叉树链式结构的实现 3.1前序遍历(递归) 3.2中序遍历(递归) 3.3后序…

如何成为ChatGPT 优质Prompt创作者

如何提问? 我想让你成为我的Prompt创作者。你的目标是帮助我创作最佳的Prompt,这个Prompt将由你ChatGPT使用。你将遵循 以下过程:1.首先,你会问我Prompt是关于什么?我会告诉你,但我们需要 通过不断的重复来…

LCR 176. 判断是否为平衡二叉树

解题思路: class Solution {public boolean isBalanced(TreeNode root) {return recur(root) ! -1;}private int recur(TreeNode root) {if (root null) return 0;int left recur(root.left);if(left -1) return -1;int right recur(root.right);if(right -1) …

使用通用MCU实现无人机飞行任务的快速二次开发

使用通用MCU实现无人机飞行任务的快速二次开发 ---TIDronePilot外部控制offboard模式介绍 无名小哥 2024年1月1日 传统飞控二次开发方法和主要存在的问题简介 通过对前面几讲中《零基础竞赛无人机积木式编程指南》系列开发教程的学习可知,在以往TI电赛真题的学习…

2023APMCM亚太数学建模C题 - 中国新能源汽车的发展趋势(2)

五.问题二模型建立和求解 5.1 问题二模型建立和求解 针对题目二,题目要求收集中国新能源电动汽车行业发展数据,建立数学模型描述,并预测未来十年的发展。由于在第一文中,我们已经收集了一定的新能源行业发展数据&…

Quartus II 13.1的安装及使用

Quartus II 13.1的安装及使用_quartus13.1-CSDN博客1.3 Verilog 环境搭建 | 菜鸟教程 学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartu…

【React系列】JSX核心语法和原理

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. ES6 的 class 虽然目前React开发模式中更加流行hooks,但是依然有很多的项目依然是使用类组件&#x…

imgaug库指南(三):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

14.7-时序反馈移位寄存器建模

时序反馈移位寄存器建模 1,阻塞赋值实现的LFSR,实际上并不具有LFSR功能1.1.1,RTL设计,阻塞赋值1.1.2,tb测试代码1.1.3,波形仿真输出,SIM输出,没实现LFSR1.2.1,RTL设计&am…

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】 一、导出虚拟机二、导入虚拟机三、启动数据库四、使用Data Studio连接数据库 一、导出虚拟机 选择关机状态的虚拟机 -> 管理菜单 -> 导出虚拟电脑 点击完成后,需要等待一小段时间,如…