`
1025250620
  • 浏览: 230414 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Linux Shell编程学习笔记(一)变量和文件描述符

 
阅读更多

看了<Unix的设计思想>,情不自禁希望重新学习我曾经忽视的linux的shell脚本编程。我并不是随波逐流,也不是那种顽固的技术党,只是很纯粹的想了解这么技术,如果你有什么好的想法,也可以跟我交流,下面是我的微博地址:

http://weibo.com/1752090185/profile?rightmod=1&wvr=5&mod=personinfo

如果你有跟我一样的学习热情,不妨跟我一块学习下去。

先说变量的定义:

变量的定义非常的简单,就是变量名=变量值,中间不加空格。如果你加上空格,那么shell会认为这个是一个命令而不是一个语句。而你在引用变量的时候可以通过$变量名的方式来引用。其实你也可以通过${变量名}和$((变量名))的方式来取出它的值。$符号后面将被默认解析成变量,这里我做了一个假设,比如你有一个变量为a,另外一个变量为ab,那么它取的是a的值还是ab的值呢?

如果出现的是下列这种语句呢?

$abc

对,应该是没有这个变量的,它会去查找abc这个变量,而这个变量我们压根就没有定义过.那么如果我们一定要取得a这个变量呢?相信你跟我一样已经有了答案,那就是写成${a}bc的形式。

接下来我们要说到一个很特别的变量叫做环境变量,环境变量我们可以理解为系统预设的宏,或者常量。当然这么说可能不合理,因为环境变量是可以设置的。子进程可以定义自己的环境变量,父进程会将环境变量的参数传递给子进程。

环境变量的设置要通过export命令,通过不带参数的export命令可以打印出所有的环境变量.也许有人会问,我为什么要用export命令呢?我用=一样可以定义变量。实际上是这样的,我们自己定义的变量只在进程内有效,是不会传递给子进程的。那怎么测试这样东西呢?我们知道在shell执行的大部分命令都是开启一个进程,发生了进程的上下文切换,我们可以在shell命令行里面再启动一个shell作为上一个shell的子进程。

在启动shell之前我们先定义两个变量

param1="david_chen"

export param2="chen_david"

接下来我们执行一下shell,我这里使用的是bash,我就执行一下bash

好了,接下来我们打印一下这两个参数吧,我们发现,param1没有东西,而param2是正常的。

在shell里面,每一变量的类型我们都可以理解为是一个字符串数组,也就是说在shell里面是没有类型的,也就是所谓的弱类型语言。

我们知道我们学习语言的本质目的是为了运算,我们先说一下数学运算.数学运算里面有三个常用的命令:

expr,let 和 bc.

expr,let用于整数运算,而bc用于浮点数运算。

之前我们提到过{}(())这两个算子,是用来引用变量的,这里我们引入了另外一个算子[],这些算子里面的变量都是可以不加$的,而能用于算数运算的是(())和[] 也就是说这两个基本上是等价的。而在使用这些操作符号的时候一定要注意变量和符号之间要有空格。浮点数我们就不深究了,有需要我会再回头来看下资料的。

 

接下来我们接着我们的第二个主题,文件描述符。

其实文件描述符就是一个句柄,或者说是一个字长的整数。其中的三个整数是被系统占用的也就是0,1,2。它们分别对应着标准输入,标准输出和错误。重定向的目的就是将这些流的方向重新定向到你希望的地方。你可能将它持久化,可能是管道,也可能是网络。

不论我们是标准输出,还是错误输出,我们都会在屏幕上看到信息,因此我们可以看出,实际上标准输出和错误输出实际上对应的是同一个定向终端文件。也就是屏幕。我们可以通过数字来制定文件描述符的定向流。

比如说 2>syserr.log 那么也就是将2描述符也就是错误输出定向到syserr.log这个文件流中,而1>sysout.log也是一样的道理。如果你采用这种方法那么你的标准定向就会发生变化。

命令格式为:

cmd 2>syserr.log 1>sysout.log

如果你认为2中的数据没有你需要的,你可以定向到一个很特殊的文件 /dev/null中,所有被定向到这个文件中的流都会被丢弃。

接下来我将介绍一个非常重要的数据结构,数组。称它为数组可能并不恰当,可以称它为映射表,和其他的脚本语言非常类似,这里我们所说的数组一样具有映射功能。

数组的定义可以通过 array=(1 2 3 4)这种方式来定义,一般的脚本都会支持空格和,两种分割符号,但是在shell里面只支持空格。这里我们还是可以引用C语言中的指针思想,其实在shell脚本中的数组就是一个地址指针。我们知道,在数组中,数组的指针对应着索引0的位置,我尝试了一下打印$array:

发现真的如我所愿打印出1 那么对于指针运算是否支持呢?在前面我们知道对于算数运算的算子是[].我尝试了一下指针的运算$[ array + 1].如我们所料的一样它打印出索引为1的指针指向数值。我们可以类比的推断出来,其实shell中的数组也是一种指针,通过对指针的运算,实际上得到的还是个指针。与我们的传统变量不同,传统变量得到的是一个具体的值。那就更加奇怪了不是吗?

我们在定义一个变量a=1的时候,通过运算$[a+1]得到的是2,如果a是一个数组,我们得到的是一个指针指向值。这两种截然不同的操作只说明一点。shell是有类型的,我们姑且可以认为有两种,一种是普通类型,一种是指针类型。不过貌似所有的语言大都是这种模式,只不过对于弱语言来说是后期绑定的类型。

好的我们上面讲了我们在取得数组值的时候可以采用$[a+n]的方法来获得,还有一种是通过${a[n]}的形式来获得索引为n的值.如果我们要遍历整个数组呢?

${array[*]}

这种写法可以让我们遍历整个数组。对于数组长度的运算采用$[#array[*]],就跟我们的字符串数组一样。你定义了一个字符串数组a="123"

${#a}就是得到这个字符串数组的长度。说完索引数组,我们接着说关联数组

 关联数组之前是需要调用declare -A testarray来申明关联数组类型的,我也不知道为何,我希望有了解的读者能给我个答案。可以加我的微博@ -非子墨- 来跟我私信。

然后配置你的关联属性.对于关联数组中的key,你不得不给出[]下标,不然可能会出现"为关联数组赋值时必须使用下标"这种错误。所以关联数组的格式为:

([key1]=value1 [key2]=value2)

如果打印keys的话只需要在数组前面加上!符号~估计在数组中除了value就是key吧~~

分享到:
评论

相关推荐

    ysoserial-master.zip

    ysoserial是一个用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。它包含一系列在常见Java库中发现的"gadget chains",可以在特定条件下利用执行不安全的反序列化操作的Java应用程序。ysoserial项目最初在2015年AppSecCali会议上提出,包含针对Apache Commons Collections(3.x和4.x版本)、Spring Beans/Core(4.x版本)和Groovy(2.3.x版本)的利用链

    zigbee CC2530无线自组网协议栈系统代码实现协调器与终端的TI Sensor实验和Monitor使用.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

    YOLO算法-自卸卡车-挖掘机-轮式装载机数据集-2644张图像带标签-自卸卡车-挖掘机-轮式装载机.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    Oracle10gDBA学习手册中文PDF清晰版最新版本

    **Oracle 10g DBA学习手册:安装Oracle和构建数据库** **目的:** 本章节旨在指导您完成Oracle数据库软件的安装和数据库的创建。您将通过Oracle Universal Installer (OUI)了解软件安装过程,并学习如何利用Database Configuration Assistant (DBCA)创建附加数据库。 **主题概览:** 1. 利用Oracle Universal Installer (OUI)安装软件 2. 利用Database Configuration Assistant (DBCA)创建数据库 **第2章:Oracle软件的安装与数据库构建** **Oracle Universal Installer (OUI)的运用:** Oracle Universal Installer (OUI)是一个图形用户界面(GUI)工具,它允许您查看、安装和卸载机器上的Oracle软件。通过OUI,您可以轻松地管理Oracle软件的安装和维护。 **安装步骤:** 以下是使用OUI安装Oracle软件并创建数据库的具体步骤:

    消防验收过程服务--现场记录表.doc

    消防验收过程服务--现场记录表.doc

    (4655036)数据库 管理与应用 期末考试题 数据库试题

    数据库管理\09-10年第1学期数据库期末考试试卷A(改卷参考).doc。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    YOLO算法-瓶纸盒合并数据集-3161张图像带标签-纸张-纸箱-瓶子.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    职业暴露后的处理流程.docx

    职业暴露后的处理流程.docx

    Java Web开发短消息系统

    Java Web开发短消息系统

    java毕设项目之ssm基于java和mysql的多角色学生管理系统+jsp(完整前后端+说明文档+mysql+lw).zip

    项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7

    批量导出多项目核心目录工具

    这是一款可以配置过滤目录及过滤的文件后缀的工具,并且支持多个项目同时输出导出,并过滤指定不需要导出的目录及文件后缀。 导出后将会保留原有的路径,并在新的文件夹中体现。

    【图像压缩】基于matlab GUI DCT图像压缩(含MAX MED MIN NONE)【含Matlab源码 9946期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip

    YOLO算法-挖掘机与火焰数据集-7735张图像带标签-挖掘机.zip

    操作系统实验 Ucore lab5

    操作系统实验 Ucore lab5

    IMG_5950.jpg

    IMG_5950.jpg

    竞选报价评分表.docx

    竞选报价评分表.docx

    java系统,mysql、springboot等框架

    java系统,mysql、springboot等框架

    zigbee CC2530网关+4节点无线通讯实现温湿度、光敏、LED、继电器等传感节点数据的采集上传,网关通过ESP8266上传远程服务器及下发控制.zip

    1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用IAR软件开发,当前在CC2530上运行,如果是其他型号芯片,请自行移植。 3、软件下载时,请注意接上硬件,并确认烧录器连接正常。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、例程具有一定专业性,非专业人士请谨慎操作。

    YOLO算法-快递衣物数据集-496张图像带标签.zip

    YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;

    搜索引擎lucen的相关介绍 从事搜索行业程序研发、人工智能、存储等技术人员和企业

    内容概要:本文详细讲解了搜索引擎的基础原理,特别是索引机制、优化 like 前缀模糊查询的方法、建立索引的标准以及针对中文的分词处理。文章进一步深入探讨了Lucene,包括它的使用场景、特性、框架结构、Maven引入方法,尤其是Analyzer及其TokenStream的实现细节,以及自定义Analyzer的具体步骤和示例代码。 适合人群:数据库管理员、后端开发者以及希望深入了解搜索引擎底层实现的技术人员。 使用场景及目标:适用于那些需要优化数据库查询性能、实施或改进搜索引擎技术的场景。主要目标在于提高数据库的访问效率,实现高效的数据检索。 阅读建议:由于文章涉及大量的技术术语和实现细节,建议在阅读过程中对照实际开发项目,结合示例代码进行实践操作,有助于更好地理解和吸收知识点。

Global site tag (gtag.js) - Google Analytics