首页 > 系统 > Linux > 正文

shell脚本学习指南[三](Arnold Robbins & Nelson H.F. Beebe著)

2019-10-26 18:39:18
字体:
来源:转载
供稿:网友

今天木有冷笑话,只有一个噩耗。噩耗是:今天木有冷笑话!!!
不要总想着冷笑话嘛,有点追求,听毛主席的话:好好学习,天天向上!

第七章输入输出、文件与命令执行

学C的应该了解标准输入输出和错误输出吧?感觉总打很多字进度太慢,所以一直在省略类似C的东西,也方便以后看这篇文章的人能够快速学完shell脚本(或者是快速看完这本书)。

读取行read命令是重要方式之一,它可以自标准输入读取行后,通过shell字段切割的功能(使用$IFS)进行切分,第一部分给第一个变量,第二部分给第二个,类推。如果切割单词多余变量,则剩下所有的给最后一个变量。如果输入行以反斜杠结尾,则read会丢弃反斜杠与换行符继续读取下行数据。它有一个选项 -r,它将忽视最后反斜杠当读入数据。使用read可能的一个错误是通过循环让read读取一个文件如:
while IFS=: read user pass uid gid fullname homedir shell < /etx/passwd ... 这个循环将一直下去并且每次read只读passwd的第一行。因为每次循环都重新打开了passwd文件读取内容。解决办法是: cat /etc/passwd | while IFS=: read ....... 这样通过管道解决读取文件问题。 这里有一个概念,文件描述符,一般这个文件描述符是由0-9这几个数字来描述的,所以传统上shell也就允许你最多打开十个文件。比如make 1> results 2> ERRS 。命令make的标准输出(文件描述符1)传给results,并将错误输出(文件描述符2)传给ERRS。设置完文件描述符后,如何引用呢?像这样:make > results 2>&1 。
1> results这里的1其实没必要,供输出重定向的默认文件描述符是标准输出,也就是文件描述符1,重定向 > results让文件描述符1作为文件results,接下来重定向2>&1有两部分,2>重定向文件描述2,也就是标准错误输出。而&1就是刚才我们的疑问,用来引用我们定义的文件描述符。特别注意:2>&1这样的四个字符一定要连着写。

再介绍一个用来改变shell本身I/O设置的exec命令。如果只有I/O重定向而没有任何参数时,exec会改变shell的文件描述符:

代码如下:
exec 2> /tmp/$0.log #重定向shell本身的标准错误输出
exec 3< /some/file #打开新文件描述符3
...
read name rank serno <&3 #从该文件读取 exec 3>&- #关闭文件描述符3

上例展示了如何关闭文件描述符。
exec还有一个功能就是在当前shell下执行指定的程序。

书中对printf做了完整的介绍,这里就不再介绍了,就是C里边的那些东西。

shell中有两种与文件名相关的展开:第一个是波浪号展开(~ tilde expansion),另一个叫法较多如通配符展开式(wildcard expansion)、全局展开(globbing)或路径展开(pathname expansion)。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表