Shell语言系列之一:文件处理
前言
  标准输入/输出可能是软件工具设计原则里最基本的观念了。有很多UNIX程序都遵循这一设计历练。默认情况下,他们会读取标准输入,写入标准输出,并将错误信息传递给标准错误输出。
  本文主要讲read命令、重定向、以及文件名匹配。
本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。
正文
使用read读取行
  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
 
read可以一次读取所有的值到多个变量里。这种情况下,在$IFS里的字符会分隔输入行里的数据,使其称为各自独立的单词。例如:
printf "Enter name, rank, serial number: "
read name rank serno
 
最典型的用法是处理/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
重定向
 
我们已经知道基本的输入输出重定向运算符: 、>>以及|,这里在看看还有哪些运算符。
 
【使用set -C搭配】POSIX Shell提供了防止文件意外截断的选项:执行 set -C命令可以打开shell 所谓的禁止覆盖(noclobber)选项。当这个选项打开时,单纯的>重定向
遇到目标文件已存在时就会失败。>|运算符则可以令noclobber失效。
 
【提供行内输入的
[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
 
在系统内部,UNIX是以一个小的整数数字,称为文件描述符(File descriptors),表示每个进程的打开文件。数字由0开始。至多到系统定义的打开文件数目限制。传统上,Shell容许你
直接处理至多10个打开文件,描述符从0到9.
 
文件描述符0,1和2各自对应标准输入、标准输出以及标准错误输出。
make 1>results 2>ERRS,将标准输出传给results,将错误输出传给ERRS。
make 1>results 2>/dev/null,直接舍弃错误信息。
make > results 2>&1,将输出与错误信息传送给相同的文件。
 
最后要介绍的是可以用来改变Shell本身I/O设置的exec命令
exec 2> /tmp/$0.log #重定向Shell本身的标准错误输出
exec 3
...
read name rank serno
波浪号展开和通配符
 
Shell有两种与文件名相关的展开。一种叫做波浪号展开,一种叫做通配符展开。
 
~波浪号展开的目的,是将用户根目录的符号型表示方式改为实际的目录路径。
$vi ~/.profile #与vi $HOME/.profile相同
$vi ~tolstoy/.profile #编辑用户tolstoy的.profile文件
 
寻找文件名里的特殊字符,也是Shell提供的服务之一。当它找到这类字符时,会将它们视为匹配模式。
?表示任何单个字符
*任何的字符字符串
[set] 任何在set里的字符
[!set]任何不再set里的字符
作者
出处:http://www.cnblogs.com/gina
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Shell语言系列之一:文件处理的更多相关文章
- (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹
原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...
- shell编程系列13--文本处理三剑客之sed利用sed追加文件内容
shell编程系列13--文本处理三剑客之sed利用sed追加文件内容 追加用法总结: .a 在匹配行后面追加 .i 在匹配行前面追加 .r 将文件内容追加到匹配行后面 .w 将匹配行写入指定文件 追 ...
- shell编程系列12--文本处理三剑客之sed利用sed修改文件内容
shell编程系列12--文本处理三剑客之sed利用sed修改文件内容 修改命令对照表 编辑命令 1s/old/new/ 替换第1行内容old为new ,10s/old/new/ 替换第1行到10行的 ...
- C#)Windows Shell 编程系列5 - 获取图标
原文 C#)Windows Shell 编程系列5 - 获取图标 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 编程系列4 - 上下 ...
- (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ...
- (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单
原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 接上一节:(C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开这 ...
- (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开
原文 (C#)Windows Shell 编程系列2 - 解释,从“桌面”开始展开 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一篇:(C#)Windows Shell 编 ...
- linux shell语言编程规范安全篇之通用原则【转】
shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...
- Shell脚本系列教程二: 开始Shell编程
Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...
随机推荐
- 洛谷P4606 [SDOI2018]战略游戏 【圆方树 + 虚树】
题目链接 洛谷P4606 双倍经验:弱化版 题解 两点之间必经的点就是圆方树上两点之间的圆点 所以只需建出圆方树 每次询问建出虚树,统计一下虚树边上有多少圆点即可 还要讨论一下经不经过根\(1\)的情 ...
- BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...
- 20165218 2017-2018-2 《Java程序设计》课程总结
20165218 2017-2018-2 <Java程序设计>课程总结 一.每周作业链接汇总 20165218 我期望的师生关系 20165218 学习基础和C语言基础调查 2016521 ...
- Linux(一)——认识Linux
一.Linux介绍 (安装的是Centos6.7) 1.Linux 系统是一套免费使用和自由传播的类 Unix 操作系统(主要用在服务器上),是一个基于 POSIX 和 UNIX 的多用户.多任务.支 ...
- 一个优质的Vue组件库应该遵循什么样的设计原则
一.组件库的价值 就个人而言,拥有一套自己的组件库,可以让你的开发变得更高效,让你在行业里更有价值. 就团队而言,拥有一套团队的组件库,可以让协同开发变得更高效规范,让你的团队在公司更具有影响力. 就 ...
- Redis 为什么用跳表而不用平衡树
Redis 为什么用跳表而不用平衡树? 本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用s ...
- Kubernetes 1.5部署sonarqube
前面几篇博文我们一直在说kubernetes的基础环境的安装及部署.在基础环境部署完成以后,我们开始尝试使用kubernetes来管理我们的应用.本篇博文通过一个简单的示例来向大家展示如何通过depl ...
- 「Python」python与微信
pip3 install itchat 主要用到的方法: itchat.login() 微信扫描二维码登录 itchat.get_friends() 返回完整的好友列表,每个好友为一个字典, 其中第一 ...
- 维护后面的position sg函数概念,离线+线段 bzoj 3339
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1160 Solved: 596[Submit][Status][ ...
- 【Codeforces752D】Santa Claus and a Palindrome [STL]
Santa Claus and a Palindrome Time Limit: 20 Sec Memory Limit: 512 MB Description 有k个串,串长都是n,每个串有一个a ...