zoukankan      html  css  js  c++  java
  • 2021-2022-1 20191315《信息安全系统设计与实现(上)》学习笔记3

    sh编程

    sh脚本

    sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。

    • 创建mysh:
      #! /bin/bash
      # comment line
      echo hello
    

    使用 chmod -x mysh 使其可执行,然后运行mysh

    sh脚本与C程序

    • sh脚本和C程序有一些相似之处,但它们在根本上是不同的。
    • sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。若是可执行命令且为内置命令则直接执行,否则复刻一个子进程来执行命令,并等待子进程终止再继续,每个变量都是字符串,sh脚本不需要main函数,第一个可执行语句是程序的入口点。C语言必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件,每个变量必须有一个类型,必须有main()函数。

    命令行参数

    可使用与运行sh命令完全相同的参数调用sh脚本,如
    mysh one two three
    可通过位置参数$0、$1、$2等访问命令行参数,前10个命令行参数可以作为$0~$9被访问,10以上参数必须称为${n},或者可以通过稍后显示的shift命令查看他们。

    • 可用内置变量$#和$计数并显示命令行参数
      $# = 命令行参数$1到$n的数量
      $
      = 所以命令行参数,包括$0
      与命令执行相关的
      $S = 执行sh的进程PID
      $? = 最后一个命令执行的退出状态,成功为0

    sh变量

    • 内置变量:PATH、HOME、TERM等
    • 还可以以使用任何符号作为sh变量,所有sh变量值都是字符串,未赋值的为NULL
    • 变量赋值
      variable=string

    sh中的引号

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

    sh语句

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

    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的输入行。

    Linux命令

    • echo命令:echo只是将参数字符串作为行回显到stdout,通常将相邻的多个空格压缩为一个空格,除非有冒号
    • expr命令:将两个参数字符串转换为数字,然后对数字执行操作OP,再将得到的数字转换回字符串
      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)。
    echo $(date)
    echo $(ls dir)

    sh控制语句

    if-else-fi语句

      if [condition]
        then
          statemates
        else
          statements
      fi
    

    if-elif-else-fi语句

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

    for语句

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

    while语句

      while [condition]
        do 
          commands
        done
    

    until-do语句

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

    case 语句

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

    continue和break语句
    与C语言一样,continue重启最近循环的下一个迭代,break退出最近循环,工作原理相同

    I/O重定向

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

    sh函数

    sh函数定义

      func()
      {  
        # function code
      }
    

    sh通配符

    *:可扩展到当前目录中的所有文件
    ?:查询某文件名中的字符
    []:查询文件名中一对[]中的字符

    命令分组

    可以用{}或()对命令进行分组

    eval语句

    eval是sh的一个内置命令,将输入参数字符串连接到一个字符串中,然后给出结果字符串

    调试sh脚本

    sh脚本可由带有-x选项的子sh运行,以进行调试
    bash -x mysh

    问题

    sh中所有的值作为字符串,要是想比较整数数值大小改怎么写?

    • if [s1 = s2]
      在上述语句中,左括号符号[实际上是一个测试程序,作为以下内容执行: test string1 comp string2 or [ string1 comp string2 ]
      它比较两个参数字符串,以确定条件是否为真。需要注意的是,在sh中,0为TRUE.而非0为 FALSE,这与在C程序中完全相反。这是因为当sh执行命令时,它会获得命令执行的退出状态,如果执行成功,则为0,否则为非0。由于[是一个程序,所以如果执行成功,则退出状态为0,即测试条件为真,如果测试条件为假,则退出状态为非0。或者,用户也可以使用sh内置变量$?来测试最后一次命令执行的退出状态。
    • 相反地,运算符-eq、-ne、-lt、-gt 等将参数作为整数进行比较
      if["123”="0123"] is false since they differ as strings
      if["123"-eg"0123"] is true since they have the same numerical value
    • 除了比较字符串或数值之外,测试程序还可以测试文件操作中经常需要的文件类型和文件属性。
    if [ -e name ]	# test whether file name exists	
    if [ -f name ]	# test whether name is a (REG) file	
    if [ -d name ]	# test whether name is a dir	
    if [ -r name ]	# test whether name is readable similarly for -w, -x, ete.	
    if [ f1 -ef f2 ]# test whether f1, f2 are the same file
    

    学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?

    程序设计语言有3个方面的因素,即语法、语义和语用。语法表示程序的结构或形式,亦即表示构成语言的各个记号之间的组合规律,但不涉及这些记号的特定含义,也不涉及使用者。语义表示程序的含义,亦即表示按照各种方法所表示的各个记号的特定含义,但不涉及使用者。程序=数据结构+算法
    Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存去执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。

  • 相关阅读:
    MyImages
    【优惠&正版】超级硬盘数据恢复软件(SuperRecovery)7.1正版注册码(39元一机终身授权,支持最新版)
    【2020年4月24日】TTradmin v2.3.2 简单好用的临时远程协助软件
    Radmin Center 1.54 测试版
    VS2015 编译原版 tightvnc 2.8.27 源码
    Centos 安装 Go 编译环境
    GHO文件安装到Vmware的两种姿势
    Radmin Server v3.5.2.1 汉化破解绿色版,完整版+精简版【20190505更新】
    系统服务监视、系统服务守护 ServiceMonitor
    API Monitor v2.0 Alpha-r13 (32+64) 汉化版
  • 原文地址:https://www.cnblogs.com/harperhjl/p/15334624.html
Copyright © 2011-2022 走看看