• 《Unix&Linux系统编程》第十章学习笔记


    第10章 sh编程

    10.1 sh脚本

    ​ sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。sh脚本的第一行通常以#!组合开始,成为shebang,当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。shebang允许主sh 调用适当版本的sh来执行脚本,如果未指定shebang,它将运行默认的sh。

    10.2 sh脚本与C程序

    ​ sh是一个解释程序,逐行读取sh脚本并直接执行这些行,如果行是可执行命令且为内置命令,那么sh可以直接执行,否则它会复刻一个子进程来执行命令,并等待子进程终止后再继续。

    ​ 相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。其次,C程序中,每个变量必须有一个类型,而sh脚本中每个变量都是字符串。

    10.3 命令行参数

    • 可以通过位置参数$0、$1、$2等访问命令行参数,前10个用$0$9,其他参数必须称为${10}${n}(n>10)。

    • $#=命令行参数$1到$n的数量

    • $*=所有命令行参数,包括$0

    • $S=执行sh的进程PID

    • $?=最后一个命令执行的退出状态(成功为0,否则为非0)

    10.4 sh变量

    • sh有许多内置变量,如PATH、HOME、TERM等。
      除了内置变量外,用户还可使用任何符号作为sh变量,不许声明。未赋值的sh变量是NULL字符串,赋值方法如下:
    variable=string  
    

    10.5 sh中的引号

    如果想把$、/、*、>、<等用作普通字符,可使用\或单引号来引用他们。
    通常\用于引用单个字符,单引号用于引用长字符串。

    10.7 sh命令

    1、内置命令

    命令 说明
    .flie 读取并执行文件
    break[n] 从最近的第n个嵌套循环中退出
    cd[dirname] 更换目录
    continue[n] 重启第n个嵌套循环
    eval[arg...] 计算一次参数并让sh执行生成的命令
    exec[arg...] sh将会退出
    exit[n] 使sh退出,退出状态为n
    export[var...] 将变量到处到随后执行的命令
    read[var...] 从stdin中读取一行并未为变量赋值
    set[arg...] 在执行环境中设置变量
    shift 将位置参数$2$3...重命名为$1$2...
    trap[arg][n] 接收到信号n后执行参数
    umask[ddd] 将掩码设置为八进制数ddd
    wait[pid] 等待进程pid,若没给出pid,则等待所有活动子进程

    2、Linux命令

    echo命令:将参数字符串作为行回显到stdout,它通常将相邻的多个空格压缩为一个,除非有引号。
    expr命令:间接更改sh变量的值(数量),它是一个程序,运行方式如下:

    expr string1 OP string2 
    

    管道命令:在sh脚本中经常使用管道作为过滤器。
    实用命令:

    • awk:数据处理程序

    • cmp:比较两个文件

    • comm:选择两个排序文件共有的行

    • grep:匹配一系列文件的模式

    • diff:找出两个文件的差异

    • join:使用相同的键来记录以比较两个文件

    • sed:流或行编辑命令

    • sort:排序或合并

    • tail:打印某文件的最后n行

    • tr:一对一字符翻译

    • uniq:从文件中删除连续重复行

    10.9 sh控制语句

    1、if-else-fi语句

    if [condition];then
      statements
    else
      statements
    fi
    

    2、if-elif-else-fi复合语句

    if [condition1];then
       commands
      elif [condition2];then
        commands
      else
        commands
    fi
    

    3、for语句

    for VARIABLE in string1 string2 ... stringn
      do
        commands
      done
    

    4、while语句

    while [condition]
      do
        commands
      done
    

    5、until-do语句

    until [$ANS = "give up"]
      do
        echo -n "enter your answer:"
        read ANS
      done
    

    6、case语句

    case $variable in
        pattern1)  commands;;
        pattern2)  commands;;
        patternN)  commands;;
    esac
    

    7、continue语句和break语句

    continue重启最近循环的下一个迭代,break退出最近循环

    10.10 I/O重定向

    形式 含义
    >file stdout转向文件,若文件不存在则创建
    >>file stdout追加到文件
    <file 将文件用作stdin;文件必须存在并具有r权限
    <<<word 从“here”文件中获取输入,直到只包含“word”的行

    10.12 sh函数

    func()
    {
      #function code
    }
    

    10.13 sh中的通配符

    • 星号通配符

    • ?通配符

    • []通配符

    10.14 命令分组

    在sh脚本中,可以用{}或()对命令进行分组。

    10.15 调试sh脚本

    由带有-x选项的子sh运行

    问题与解决思路

    1、总结一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?

    (1)要素:

    • 数据类型
    • 常量
    • 变量
    • 运算符
    • 表达式
    • 标识符
    • 关键字
    • 数组
    • 基本控制结构
    • 函数
    • 输入和输出
    • 解释器和编译器
      (2)技能:
    • 数据结构的分析和设计
    • 算法(即处理逻辑,微观层次)的分析和设计
    • 系统架构(即处理逻辑,宏观层次)的分析和设计
      (3)shell脚本:
    • 用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
    • 提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
  • 相关阅读:
    POJ2774 Long Long Message
    Lyndon Word相关
    后缀自动机(SAM)
    后缀数组(SA)
    [THUSC2016]补退选
    [HNOI2008]GT考试
    CF1080E Sonya and Matrix Beauty
    [JSOI2008]火星人
    两道FFT题目略解
    网络流概念+EdmondKarp算法+Dinic(Dinitz)
  • 原文地址:https://www.cnblogs.com/weihehahaha/p/16705631.html
Copyright © 2020-2023  润新知