zoukankan      html  css  js  c++  java
  • 20191302董佳帅 第十章学习笔记

    第十章 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以上参数必须称为${n}
    • 可用内置变量$#和$*计数并显示命令行参数
      • $# = 命令行参数$1到$n的数量
      • $* = 所以命令行参数,包括$0
      • $S = 执行sh的进程PID
      • $? = 最后一个命令执行的退出状态

    sh变量

    • 内置变量
      • PATH、HOME、TERM等
    • 变量赋值
      variable=string
    

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

    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 $(ls dir)
        

    sh控制语句

    • if-else-fi语句
      •   if [condition]
            then
              statemates
            else
              statements
          fi
        
      -运算符 -eq -ne -lt -gt
    • 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语句

    I/O重定向

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

    sh函数

    • sh函数定义
        func()
        {  
          # function code
        }
      

    sh通配符

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

    eval语句

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

    调试sh脚本

    bash -x mysh

    问题与解决思路

    • 问题:shell编程相对于C编程、java编程,其自身优势是什么呢?
    • 解决:Shell脚本语言的好处是简单、易学、易用,适合处理文件和目录之类的对象,以简单的方式快速完成某些复杂的事情通常是创建脚本的重要原则,脚本语言的特性可以总结为以下几个方面:
      1. 语法和结构通常比较简单。
      2. 学习和使用通常比较简单,
      3. 通常以容易修改程序的“解释”作为运行方式,而不需要“编译。
      4. 程序的开发产能优于运行效能。
      • Shell脚本语言是Linux/Unix系统上一种重要的脚本语言,在Linux/Unix领域应用极为广泛,熟练掌握Shell脚本语言是一个优秀的Linux/Unix开发者和系统管理员必经之路。利用Shell脚本语言可以简洁地实现复杂的操作,而且Shell脚本程序往往可以在不同版本的Linux/Unix系统上通用。

    实践内容

    • 利用shell脚本编程在OpenEuler中编写一个猜数字游戏
      • 代码截图
      • 运行结果
  • 相关阅读:
    BZOJ 4236~4247 题解
    OCUI界面设计:滚动视图与分页控件初探
    大数乘法
    Effective C++ 11-17
    [Matlab+C/C++] 读写二进制文件
    Java 反射 方法调用
    如何使用LaTeX让自己不乱?
    LaTeX 相对于 Word 有什么优势?
    你在发表理科学术文章过程中有哪些经验值得借鉴?
    破译手势在对话中的意义
  • 原文地址:https://www.cnblogs.com/dongjiashuai/p/15321302.html
Copyright © 2011-2022 走看看