学习笔记3

第十章 sh编程
    10.1 sh脚本
        sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句
        sh脚本的第一行通常以#!组合开始,通常称为shebang
        shebang允许主sh调用适当版本的sh来执行脚本
    10.2 sh脚本与C程序
        sh脚本和C程序有一些相似之处,但它们在根本上是不同的
        首先,sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行
    10.3 命令行参数
        可使用与运行sh命令完全相同的参数调用sh脚本
  •             $#=命令行参数$1到$n的数量
  •             $*=所有命令行参数,包括$0
            sh还有命令执行相关的以下内置变量
  •             $S=执行sh的进程PID
  •             $?=最后一个命令执行的退出状态
            在sh中,特殊字符$表示替换
    10.4 sh变量
        sh有许多内置变量,如PATH、HOME、TERM等
        除了内置变量外,用户还可使用任何作为sh变量,不需要声明
        所有的sh变量值都是字符串,未赋值的sh变量是NULL字符串
    10.5 sh中的引号
        sh有许多特殊字符,如$、/、*、>、<等,要想把它们用作普通字符,可使用\或单引号来引用它们
        通常,\用于引用单个字符,单引号用于引用长字符串
  •             单引号用于引用长字符串,单引号内没有替换
  •             双引号用于保留双引号字符串中的空格,但在双引号内会发生替换
    10.6 sh语句
        sh语句包括所有Unix/Linux命令,以及可能的I/0重定向
        此外,sh编程语言还支持sh程序执行的测试条件、循环、case等语句
    10.7 sh命令
        10.7.1 内置命令
            sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程,下面列出一些常用的内置sh命令:
  •                 .file:读取并执行文件
  •                 break[n]:从最近的第n个嵌套循环中退出
  •                 cd[dirname]:更换目录
  •                 continue[n]:重启最近的第n个嵌套循环
  •                 eval[arg...]:计算一次参数并让sh执行生成的命令
  •                 exec[arg...]:通过这个sh执行命令,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,则等待所有活动子进程
            read命令:当sh执行read命令时,它会等待来自stdin的输人行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。
        10.7.2 Linux命令
            sh可以执行所有的Linux命令
            其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。主要有以下命令:
  1.  echo命令:echo只是将参数字符串作为行回显到stdout,它通常将相邻的多个空格压缩为一个空格,除非有引号
  2.  expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值
  3.  管道命令:在sh脚本中经常使用管道作为过滤器
  4.  实用命令:除了上面的Linux命令之外,sh还使用许多其他实用程序作为命令
  •                     awk:数据处理程序
  •                     cmp:比较两个文件
  •                     comm:选择两个排序文件共有的行
  •                     grep:匹配一系列文件的模式
  •                     diff:找出两个文件的差异
  •                     join:通过使用相同的键来连接记录以比较两个文件
  •                     sed:流或行编辑命令
  •                     sort:排序或合并文件
  •                     tail:打印某个文件的最后n行
  •                     tr:一对一字符翻译
  •                     uniq:从文件中删除连续重复行
    10.8 命令替换
        在sh中,$A会被替换成A值
        同样,当sh遇到'cmd'(用引号括起来)或$(cmd)时,它会先执行cmd,然后用执行的结果字符串替换$(cmd)
    10.9 sh控制语句
        sh是一种编程语言,支持许多执行控制语句
        10.9.1 if-else-fi语句
    if [ condition ]
      then
        statements
      e1se
        statements
    fi 
            需要注意的是,在sh中,0为TURE,而非0为FALSE
            if-elif-else-fi复合语句
                在sh中使用elif而不是else if
                复合条件:与在C语言中一样,sh也允许在符合条件中使用&&(AND)和||(OR),但是语法比C语言更加严格。条件必须用喻队匹配的双括号[[和]]括起来。
        10.9.2 for语句
    
    
    for VARIABLE in string1 string2....stringr
      do
        commands
       done
        10.9.3 while语句
    while [ condition ]
      do
        commands
      done
        10.9.4 until-do语句
    until[ $ANS="give up"]
      do
        echo -n "enter your answer:"
        read ANS
      done
        10.9.5 case语句
    case $variable in
      pattern1) command;;
      pattern2) command;;
      patternN) command;;
    esac
        10.9.6 continue和break语句
   与在C语言中一样,continue重启最近循环的下一个迭代,break退出最近循环
    

     

    10.10 I/O重定向
        当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件
        I/O重定向有以下形式和含义:
  •     >file  stdout转向文件,如果文件不存在将会创建文件
  •     >>file stdout追加到文件
  •     <file  将文件用作stdin;文件必须存在并具有r权限
  •     <<word 从“here”文件中获取输人,直到只包含“word”的行
    10.11 嵌入文档
        可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字
    10.12 sh函数
  sh函数的定义为:
  func()
  {
    #function code
  }
  由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数
  在sh脚本中无法声明函数原型
  sh函数的调用方式与sh脚本文件的执行方式完全相同
    10.13 sh中的通配符
  •   星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件
  •   ?通配符:查询某文件名中的字符
  •   []通配符:查询文件名中一对[]中的字符
    10.14 命令分组
        在sh脚本中,可以用{}或()对命令进行分组
        更有用的命令分组是(),由subsh(进程)执行
    10.15 eval语句
            eval[ arg1 arg2 ... argm ]
        eval是sh的一个内置命令,它由sh自己执行,而不需要复刻新进程。
        它将输人参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,后给出结果字符串供sh执行
    10.16 调试sh脚本
        sh脚本可由带有-x选项的子sh运行,以进行调试
    10.17 sh脚本的应用
        sh脚本最常用于执行涉及冗长命令序列的常规作业
二.完善与补充内容
  1.关于shell命令
    分为以下几种:
  • 文件、目录操作命令
  • 查看文件内容命令
  • 基本系统命令
  • 监视系统状态命令
  • 磁盘操作命令
  • 用户和组相关命令
  • 压缩命令
  • 网络相关命令
  • 其他命令

  2.shell与C语言的异同

    Shell编程与C语言编程的相同点:

  1. 需要做参数声明
  2. 具备灵活性和可移植性
  3. 与操作系统结合紧密
  4. 程序运行前需要满足其环境
  5. 有相同的逻辑控制结构,如if语句while循环语句等

   Shell编程与C语言编程的不同点:

  1. shell是一种脚本语言,而C语言是计算机高级语言
  2. shell可以直接调用系统程序,方便的进行系统管理,同样实现外部调用,c需要很长的代码,而shell只要一句话
  3. shell语言就是一堆二进制命令的逻辑组合,由shell这个程序来解释其中的逻辑关系,并传达给内核,C就不同了,直接由gcc编译器翻译成二进制指令,所以更高效些

 

posted @ 2021-11-21 18:14  冯睿20191328  阅读(35)  评论(0编辑  收藏  举报