《信息安全系统设计与实现》学习笔记3

第十章 sh编程

sh脚本

  • sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。
    创建文件文本mysh,包含:
    #!/bin/bash
    # comment line
    echo hello

sh脚本与C程序

  • sh脚本和C程序有一些相似之处,但他们在根本上是不同的。
    • sh是解释程序,逐行读取sh脚本并直接执行这些行,而C语言必须先编译链接到一个二进制可执行文件。

    • 在sh脚本中,每个变量都是字符串,而C语言的变量都必须有一个类型如char、int、float等

    • sh脚本不需要main函数,而C语言必须有main函数。

命令行参数

可使用与运行sh命令完全相同的参数调用sh脚本,如:mysh one two three
sh中内置变量:

$# = 命令行参数$1到$n的数量
$* = 所有命令行参数,包括$0内置变量
$S = 执行sh的进程PID
$? = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0)

sh变量

  • sh有许多内置变量,如PATH、HOME、TERM等。

sh中的引号

  • sh中的特殊字符,如$、/、*、>、<等,要想把它们用作普通字符,可使用\或单引号来引用它们。

sh语句

  • sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。

sh命令

  • 内置命令
    .file

    break [n]

    cd [dirname]

    continue [n]

    eval [arg...]

    exec [arg...]

    exit [n]

    export [var…]

    trap [arg] [n]

    umask [ddd]

    wait pid]

    read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为几个标记,分配给列出的变量。

Linux命令

  • echo命令:echo只是将参数字符串作为行回显到stdout,它通常将相邻的多个空格压缩为一个空格,除非有引号

  • expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值,可通过expr命令间接更改sh变量的值,运行方式如下:
    expr string1 OP string2

  • 管道命令:在sh脚本中经常使用管道作为过滤器
    ps -ax | grep httpd
    cat file | grep word

  • 实用命令

    • axk:数据处理程序

    • cmp:比较两个文件

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

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

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

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

    • sed:流或行编辑命令

    • sort:排序或合并文件

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

    • tr:一对一宇符翻译

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

命令替换

  • 在sh中,$A会被替换成A值/同样,当sh遇到'cmd'或$(cmd)时,它会先执行cmd,然后用执行的结果字符替换$(cmd)

sh控制语句

  • if-else-fi语句

    • if-else-fi语句的语法是:

       if [condition]
          then
             statemates
          else
             statements
       fi
      
  • if-elif-else-fi语句

    • 这类似于C语言中的if-else- if-else

       if [condition];then
           commands
         elif [condition2];then
           commands
       else
           commands
       fi
      
  • for语句

    • sh中的for语句作用类似于C语言中的for循环

      for VARIABLE in string1 string2 ... stringn
        do
          commands
        done
      
  • while语句

    • 类似于C语言中的while循环

       while [condition]
         do
           commands
         done
      
  • until-do语句

    • 类似于C语言中的do-until语句

      until [ $ANS = "give up" ]
       do
           echo -n "enter your answer"
           read ANS
       done
      
  • case 语句

    • 类似于C语言中的case语句

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

I/O重定向

  • 当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件

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

嵌入文档

  • 可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字

sh函数

  • sh函数的调用方式与sh脚本文件的执行方式完全相同。sh语句func s1 s2 ... sn调用sh函数,以参数(字符串)形式传递s1~sn

sh中的通配符

  • 星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件

    • file *:列出当前目录中所有文件的信息

    • ls *.c:列出当前目录中所有以.c结尾的文件

  • ?通配符:查询某文件名中的字符

    • file ???:有3个字符的所有文件名

    • ls *.??:一个点号.后有两个字符的所有文件名

  • [ ]通配符:查询文件名中一对[]中的字符

    • file [ab]:包含字符a或b的所有文件名

    • ls [xyz]:列出所有包含x、y或z的文件名

    • ls [a-m]:列出包含a到m范围内字符的所有文件名

命令分组

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

eval语句

eval [arg1 arg2 ... argn]

  • eval是sh的一个内置命令。它由sh自己执行,而不需要复刻新进程。

实践:用sh脚本递归复制文件

过程



文件myrcp.sh代码

苏格拉底挑战

遇到的问题

问题:在实践“用sh脚本递归复制文件”中,执行myrcp.sh文件报错

解决办法:问gpt

看完gpt的回答,我修改了一下代码,最后运行成功

--------------------------------------------------------------------------------------------------------------------------

posted on 2023-09-24 17:11  20211417黄琪凯  阅读(9)  评论(0编辑  收藏  举报