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

2024-01-07 22:19:56

碎碎念

转眼间已经使用了一个月的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 ... )

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

祝大家玩得开心

文章来源:https://blog.csdn.net/andyshi1998/article/details/135386597
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。