博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shell语言系列之一:文件处理
阅读量:5076 次
发布时间:2019-06-12

本文共 2032 字,大约阅读时间需要 6 分钟。

前言

 &nbsp 标准输入/输出可能是软件工具设计原则里最基本的观念了。有很多UNIX程序都遵循这一设计历练。默认情况下,他们会读取标准输入,写入标准输出,并将错误信息传递给标准错误输出。

 &nbsp 本文主要讲read命令、重定向、以及文件名匹配。

    本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

使用read读取行

 &nbsp read命令是将信息传递给shell程序的重要方式之一:

[zhouzhengle@localhost ~]$ x=abc; printf "x is now '%s' Enter new value: " $x; read xx is now 'abc' Enter new value: PDQ[zhouzhengle@localhost ~]$ echo $xPDQ

 &nbsp read可以一次读取所有的值到多个变量里。这种情况下,在$IFS里的字符会分隔输入行里的数据,使其称为各自独立的单词。例如:

printf "Enter name, rank, serial number: "
read name rank serno

 &nbsp 最典型的用法是处理/etc/passwd文件。其标准格式为7个冒号隔开:用户名:加密的密码:数值型用户ID:数值型组ID:全名:根目录:登录shell。你可以使用简单的循环逐行处理/etc/passwd:

[zhouzhengle@localhost ~]$ while IFS=: read user pass uid gid fullname homedir shell> do> echo $user> done < /etc/passwd

重定向

 &nbsp 我们已经知道基本的输入输出重定向运算符: 、>>以及|,这里在看看还有哪些运算符。

 &nbsp 【使用set -C搭配】POSIX Shell提供了防止文件意外截断的选项:执行 set -C命令可以打开shell 所谓的禁止覆盖(noclobber)选项。当这个选项打开时,单纯的>重定向 遇到目标文件已存在时就会失败。>|运算符则可以令noclobber失效。

 &nbsp 【提供行内输入的<

[zhouzhengle@localhost ~]$ i=5[zhouzhengle@localhost ~]$ cat << EOF> this is the value of i $i> Here is a command substitution : $(echo hello, world)> EOFthis is the value of i 5Here is a command substitution : hello, world

 &nbsp 在系统内部,UNIX是以一个小的整数数字,称为文件描述符(File descriptors),表示每个进程的打开文件。数字由0开始。至多到系统定义的打开文件数目限制。传统上,Shell容许你 直接处理至多10个打开文件,描述符从0到9.

 &nbsp 文件描述符0,1和2各自对应标准输入、标准输出以及标准错误输出。

make 1>results 2>ERRS,将标准输出传给results,将错误输出传给ERRS。
make 1>results 2>/dev/null,直接舍弃错误信息。
make > results 2>&1,将输出与错误信息传送给相同的文件。

 &nbsp 最后要介绍的是可以用来改变Shell本身I/O设置的exec命令

exec 2> /tmp/$0.log #重定向Shell本身的标准错误输出
exec 3< /some/file #打开新文件描述符
...
read name rank serno

波浪号展开和通配符

 &nbsp Shell有两种与文件名相关的展开。一种叫做波浪号展开,一种叫做通配符展开。

 &nbsp ~波浪号展开的目的,是将用户根目录的符号型表示方式改为实际的目录路径。

$vi ~/.profile #与vi $HOME/.profile相同
$vi ~tolstoy/.profile #编辑用户tolstoy的.profile文件

 &nbsp 寻找文件名里的特殊字符,也是Shell提供的服务之一。当它找到这类字符时,会将它们视为匹配模式。

?表示任何单个字符
*任何的字符字符串
[set] 任何在set里的字符
[!set]任何不再set里的字符

作者

   出处:http://www.cnblogs.com/gina

   本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/gina/p/3252988.html

你可能感兴趣的文章
深度学习
查看>>
TCP粘包问题及解决方案
查看>>
构建之法阅读笔记02
查看>>
添加按钮
查看>>
移动端页面开发适配 rem布局原理
查看>>
Ajax中文乱码问题解决方法(服务器端用servlet)
查看>>
会计电算化常考题目一
查看>>
阿里云服务器CentOS6.9安装Mysql
查看>>
剑指offer系列6:数值的整数次方
查看>>
js 过滤敏感词
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
软件开发和软件测试,我该如何选择?(蜗牛学院)
查看>>
基本封装方法
查看>>
bcb ole拖拽功能的实现
查看>>
生活大爆炸之何为光速
查看>>
bzoj 2456: mode【瞎搞】
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
[GraphQL] Reuse Query Fields with GraphQL Fragments
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>