zoukankan      html  css  js  c++  java
  • 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失效。

       【提供行内输入的<<与<<-】使用program << delimiter,可以在Shell脚本正文内提供输入数据。这样的数据叫做潜入文件。默认情况下,shell可以在嵌入文件正文内做变量、命令和算术替换。

    [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< /some/file #打开新文件描述符
    ...
    read name rank serno <&3

    波浪号展开和通配符

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

       ~波浪号展开的目的,是将用户根目录的符号型表示方式改为实际的目录路径。
    $vi ~/.profile #与vi $HOME/.profile相同
    $vi ~tolstoy/.profile #编辑用户tolstoy的.profile文件

       寻找文件名里的特殊字符,也是Shell提供的服务之一。当它找到这类字符时,会将它们视为匹配模式。
    ?表示任何单个字符
    *任何的字符字符串
    [set] 任何在set里的字符
    [!set]任何不再set里的字符

    作者

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

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

  • 相关阅读:
    PHP 大小写转换、首字母大写、每个单词首字母大写转换相关函数
    【论文学习4】BiSample: Bidirectional Sampling for Handling Missing Data with Local Differential Privacy
    【论文学习3】Local Differential Privacy for Deep Learning
    【论文学习2】 Differential Privacy Reinforcement Learning
    深度学习中的优化算法
    Spatial crowdsourcing
    “pip install tensorflow ”出现错误
    python或pip'不是内部或外部命令”
    pip install torch出现错误
    打不开gitHub的解决方法
  • 原文地址:https://www.cnblogs.com/gina/p/3252988.html
Copyright © 2011-2022 走看看