前言

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

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

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

正文

使用read读取行

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

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

&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)
> EOF
this is the value of i 5
Here 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
...

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

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

Shell语言系列之一:文件处理的更多相关文章

  1. (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹

    原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...

  2. shell编程系列13--文本处理三剑客之sed利用sed追加文件内容

    shell编程系列13--文本处理三剑客之sed利用sed追加文件内容 追加用法总结: .a 在匹配行后面追加 .i 在匹配行前面追加 .r 将文件内容追加到匹配行后面 .w 将匹配行写入指定文件 追 ...

  3. shell编程系列12--文本处理三剑客之sed利用sed修改文件内容

    shell编程系列12--文本处理三剑客之sed利用sed修改文件内容 修改命令对照表 编辑命令 1s/old/new/ 替换第1行内容old为new ,10s/old/new/ 替换第1行到10行的 ...

  4. C#)Windows Shell 编程系列5 - 获取图标

    原文 C#)Windows Shell 编程系列5 - 获取图标 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列4 - 上下 ...

  5. (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令

    原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ...

  6. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...

  7. (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开

    原文 (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 编 ...

  8. linux shell语言编程规范安全篇之通用原则【转】

    shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...

  9. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

随机推荐

  1. Spring Batch @SpringBatchTest 注解

    Spring Batch 提供了一些非常有用的工具类(例如 JobLauncherTestUtils 和 JobRepositoryTestUtils)和测试执行监听器(StepScopeTestEx ...

  2. 使用Hexo搭建GitHub博客(2018年Mac版)

    关于本文 本文仅记录自己学习搭建Hexo博客之时,搭建过程中掉坑的历程总结,对零基础起步的观众朋友可能缺乏某些基础技术的指导,请优先食用下述两篇优质教程: [2018更新]小白独立搭建博客-Githu ...

  3. springboot集成Guava缓存

    很久没有写博客了,这段时间一直忙于看论文,写论文,简直头大,感觉还是做项目比较舒服,呵呵,闲话不多说,今天学习了下Guava缓存,这跟Redis类似的,但是适用的场景不一样,学习下吧.今天我们主要是s ...

  4. python并行编程学习之并行计算存储体系结构

    基于指令和可被同时处理的存储单元的数目,计算机系统可以分为以下四种类目: 单指令,单数据单元(SISD)在该体系结构中,计算机是单处理器机器,一次只能用单一的指令来操作单一的数据流.在SISD中,机器 ...

  5. 1.Android JUnit Runner(使用AndroidStudio)

    一.Android JUnit Runner介绍 1.Android JUnit Runner 1)是一个测试运行器,用于运行Junit3和Junit4的Android测试包 2)替换Instrume ...

  6. 第1章-初识Vue.js

    一.初识Vue 1.1.本次我们学习的内容 常用指令:vue中最基础的内容 交互: 网络请求 组件: 是vue.js 这个框架 最核心,最精华的内容,因为vue呐,它在所有的框架中是把组件化做到了极致 ...

  7. Vue.js和angular.js区别

    Vue.js:易学 简单 指令以v.xxx 一片HTML代码配合json,在new出来Vue,js实例 个人维护项目 适用于移动端 应用超越了angular angular.js:上手难 指令以ng. ...

  8. Bootstrap自学笔记

    <!DOCTYPE html><html lang="zh-cn"> <head> <meta charset="utf-8&q ...

  9. Linux高级编程--04.GDB调试程序(入门概述)

    GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试 ...

  10. [ERROR] Too many connections 尚未解决

    [ERROR] - com.alibaba.druid.support.logging.Log4j2Impl.error(Log4j2Impl.java:53) - create connection ...