• 第10章学习笔记(20191213兰毅达)


    第10章学习笔记 sh编程

    10.1-10.2
    这两个部分首先介绍了sh脚本和不同版本的sh,并把sh脚本和C语言进行比较。不难发现,sh脚本是解释程序,它会逐行读取sh脚本并直接执行,而C语言恰恰相反,它必须先编译链接,再通过主sh的子进程运行文件。除此之外,sh脚本中每一个变量都是字符串且不需要main函数,而C语言必须要有一个main函数,其变量也必须要有一个类型。
    10.3-10.8
    这部分主要说明如何编写sh脚本,包括命令行参数、sh变量、引号、sh语句、常规命令以及命令语句。

    内置命令:
    .flie、break、cd、continue用法与Linux类似
    eval:计算一次参数并让sh执行生成的命令
    exec:使用这个sh执行命令,sh将会退出
    export:将变量导出到随后执行的命令
    set:在执行环境中设置变量
    shift:将位置参数进行移动

    Linux命令
    echo命令:通常将相邻的多个空格压缩成一个空格,除非有引号
    expr命令:可将字符串转换为数字,进行操作后再转回字符串
    管道命令:经常使用管道作为过滤器
    实用命令:
    cmp:比较两个文件
    conm:选择两个排序文件共有的行
    diff:找出两个文件的差异
    sort:排序或合并文件
    tail:打印文件的最后n行
    tr:一对一字符翻译
    uniq:从文件中删除连续重复行

    10.9
    这部分介绍了sh的控制语句及其用法,包括if-else-fi、for、while、until-do、case以及continue和break语句。
    if-else-fi语句和C语言中的if-else语句类似,但需要一个fi作为结束语句。
    for、while、until-do语句也十分类似,但需要有do-done关键字

    10.10-10.16
    这部分主要是讲解如何编写sh函数以及如何使用参数调用sh函数。
    由于sh逐行执行命令1,所以必须在任何可执行语句之前定义sh脚本中的所有函数。而在被调函数中,参数被引用为$0、$1到$n,其中通常$0是函数名,$1到$n是与命令行参数对应的位置参数。函数执行结束时,$?表示其退出状态,成功时状态为0,否则状态为非0

    通配符
    file *:列出当前目录中所有文件的信息
    ls *.c:列出当前目录中所有以.c结尾的文件
    file ???:有3个字符的所有文件名
    ls *.???:一个点号,后有两个字符的所有文件名
    []:查询文件名中一对[]中的字符

    调试sh脚本则由带有-x选项的子sh运行

    10.17-10.18
    这部分主要是sh脚本的应用

    最有收获的内容
    shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh,#!/bin/bash,#!/bin/csh,,#!/bin/tcsh和,#!/bin/ksh等。下面的run.sh则指明使用bash执行。

    !bin/bash

    ls -l
    通常,shell脚本会以#!/bin/sh作为默认的shell程序。执行shell的方式有两种:第一种是为shell脚本加上可执行权限并执行,第二种是通过sh命令执行shell脚本,例如执行当前目录下的run.sh脚本,命令如下:
    //为shell脚本直接加上可执行权限并执行
    chmod 755 run.sh
    ./run.sh
    //通过sh命令执行shell脚本

    问题与解决思路

    1、设置断点时想在while循环中p=3的位置设置断点,但出现function not defined 的情况
    解决方法:gdb条件调试一般应用在循环、链表的遍历、或者其他变量的值可能被多次改变的场合。我在在条件变量p的作用域外设置断点,这样会导致断点设置无效,应该对链表设置的值while p->next进行判断,同时应该是==而不是=,导致一直在该断点。
    2、shell编程路径是对的,可是执行之后,并没有返回上一层

    !/bin/bash

    pwd
    cd ..
    pwd
    解决方法:执行:bash ./test1.sh 后的过程 :

    1. 当前进程会fork(),子进程调用exec,然后将#!后面的解释器bash程序的代码替换当前进程
    2. 上面解释器的代码已经替换了子进程,下来就是一一去处理文本中的命令
    3. 子进程再去fork(),让孙子进程去处理第一行的命令
      将第一行命令作为参数传给解释器(当前的解释器就类似于"函数")
    4. 上面只是处理了一行的命令,如果还有命令行,再去fork()
      上面的 cd.. 是在子bash中处理的,而对父bash没有影响,就出现了这种问题。

    实践


  • 相关阅读:
    oracle 索引
    oracle 子查询因子化 浅谈(with的使用)
    大数据的遐想
    数据挖掘(算法概要链接)
    orcale 修改字段属性
    sql 对一张表进行按照不同条件进行多次统计
    oracle dblink
    oracle作业
    SQL效率的几点心得
    提高SQL语句的性能
  • 原文地址:https://www.cnblogs.com/1301cn/p/15333974.html
Copyright © 2020-2023  润新知