这个题目说穿了,就是要探讨Wildcard与Regular Expression的差别的。这也是很多初学shell的朋友很容易混淆的地方。首先,让我们回到十三问之第2问,再一次将我们提到的command line format 温习一次:command_name options arguments同时,也再来理解一下,我在第5章所提到的变量替换的特性:先替换,再重组 command line!
终于,来到了shell十三问的最后一问了... 长长吐一口气~~~~最后要介绍的是shell script设计中常见的循环(loop).所谓的loop就是script中的一段在一定条件下反复执行的代码。bash shell中常用的loop有如下三种:forwhileuntilfor loopfor loop 是从一个清单列表中读进变量的值,并依次的循环执行do到done之间的命令行。
还记得我们在第10章所介绍的return value吗?是的,接下来的介绍的内容与之有关,若你的记忆也被假期所抵消的话,那建议您还是回去温习温习再回来...若你记得return value,我想你也应该记得了&& 与 || 什么意思吧?用这两个符号再搭配 command group的话,我们可让shell script变得更加聪明哦。比方说:cmd1 && { cmd2 cmd3 ;
这次的题目,之前我在 CU 的 shell 版说明过了: (原帖的连接在论坛改版后,已经失效) 这次我就不重写了,将帖子的内容 “抄” 下来就是了...文件描述符 (fd, File Descriptor)谈到I/O redirection,不妨先让我们认识一下File Descriptor(fd,文件描述符)。进程的运算,在大部分情况下,都是进行数据 (data) 的处理, 这些数据从哪里,读进来?又输出到哪里呢?
好不容易,进入了两位数的章节了... 一路走来,很辛苦吧?也很快乐吧? ^_^在解答本章题目之前,先让我们了解一个概念: return value。我们在 shell 下跑的每一个 command 或 function, 在结束的时候都会传回父进程一个值,称为 return value。在 shell command line 中可用$?, 这个变量得到最 "新" 的一个return value, 也就是刚刚结束的那个进程传回的值。
$@与 $* 差在哪?要说 $@与 $* 之前, 需得先从 shell script 的 positional parameter 谈起...我们都已经知道变量 (variable) 是如何定义和替换的, 这个不再多讲了。shell script 的 positional parameter但是,我们还需要知道有些变量是 shell 内定的, 且其名称是我们不能随意修改的。 其中,就有 positional parameter 在内。
我们上一章介绍了()与{}的不同,这次让我们扩展一下,看看更多的变化:$()与${}又是啥玩意儿呢?在bash shell中, $()与``(反引号)都是用来做命令替换(command substitution)的。所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:完成 `` 或者$()里面的命令,将其结果替换出来,再重组命令行。
嗯,这次轻松一下,不讲太多... ^_^先说一下,为何要用 () 或者 {} 好了。许多时候,我们在 shell 操作上,需要在 一定的条件下执行多个命令,也就是说, 要么不执行,要么就全执行,而不是每次 依序的判断是否要执行下一个命令。或者,要从一些命令执行的先后次序中得到结果, 如算术运算的 2*(3+4) 那样...这时候,我们就可以引入 "命令群组"
这次让我们从 CU shell 版的一个实例帖子来谈起吧: (论坛改版后,原链接已经失效)例中的提问原文如下:帖子提问:cd /etc/aa/bb/cc 可以执行 但是把这条命令放入 shell 脚本后,shell 脚本不执行! 这是什么原因?意思是:运行 shell 脚本,并没有移动到 / etc/aa/bb/cc 目录。我当时如何回答暂时别去深究,先让我们了解一下进程 (process) 的概念好了。
这次让我们暂时丢开command line,先了解一下bash变量(variable)吧...所谓的变量,就是利用一个固定的"名称"(name),来存取一段可以变化的"值"(value)。变量设定(set)在bash中, 你可以用"="
还是回到我们的command line来吧...经过前面两章的学习,应该很清楚当你在shell prompt后面敲打键盘, 直到按下Enter键的时候,你输入的文字就是command line了, 然后shell才会以进程的方式执行你所交给它的命令。 但是,你又可知道:你在command line中输入的每一个文字, 对shell来说,是有类别之分的呢?
承接上一章介绍的command line, 这里我们用echo这个命令加以进一步说明。温习标准的command line三个组成部分:command_name option argumentecho是一个非常简单、直接的 Linux 命令:$echo argumentecho将argument送出到标准输出(stdout),通常是在监视器(monitor)上输出。Note:在linux系统中任何一个进程默认打开三个文件:stdin、stdout、stderr.
当你成功登陆一个 shell 终端的文字界面之后,大部分的情形下,你会在屏幕上看到一个不断闪烁的方块或者底线(视不同的版本而别),我们称之为游标(cursor).cursor作用就是告诉你接下来你从键盘输入的按键所插入的位置,且每输入一个键,cursor便向右移动一个格子,如果连续输入太多的话,则自动接在下一行输入。
shell是什么东西之前,不妨让我们重新审视使用者和计算机系统的关系:我们知道计算机的运作不能离开硬件,但使用者却无法直接操作硬件,硬件的驱动只能通过一种称为“操作系统(OS,Opertating System)”的软件来管控。事实上,我们每天所谈的“linux”,严格来说只是一个操作系统(OS),我们称之为“内核(kernel)”。
Shell 既是一种命令语言,又是一种程序设计语言(就是你所说的 shell 脚本)。作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。Shell 十三问应该 Shell 的(思想)精华本质所在,就像武功的内功心法,能够帮助读者清晰的理解 Shell 语言的用法。
LinuxGoDockerRunGoByExample
理解Unix进程Unix编程艺术Unix环境高级编程Go Web编程Go并发编程实战
最后一章列举本文参考过的书籍和项目,欢迎大家补充和讨论更多有关进程的知识。
Sendfile是Linux实现的系统调用,可以通过避免文件在内核态和用户态的拷贝来优化文件传输的效率。其中大名鼎鼎的分布式消息队列服务Kafka就使用sendfile来优化效率,具体用法可参见其官方文档。优化策略在普通进程中,要从磁盘拷贝数据到网络,其实是需要通过系统调用,进程也会反复在用户态和内核态切换,频繁的数据传输在此有效率问题。
关注时代Java