zoukankan      html  css  js  c++  java
  • 第十章学习笔记

    第十章

    一、sh脚本

    (一)sh脚本于c程序

    sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则,他会复制一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。
    在C程序中,每个变量必须有一个类型,例如char、int、float、派生类型(如 struct)等。相反,在sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。
    每个c程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。相反,sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的人口点。

    (二)命令行参数

    $0 $1 ... $9 ${10} ... ${n}访问命令行参数,过着,可以通过shift左移后查看他们。通常(0是程序名本身。)#命令行参数(1到)n的数量;$*所有命令行参数,包括(0;)S执行sh的进程PID;$?最后一个命令执行的退出状态。

    (三)sh变量

    sh有许多内置变量,除此以外用户还可以使用任何符号作为sh变量,sh所有变量值都是字符串,不需要声明。未赋值的sh变量是NULL。
    sh有许多特殊字符,如$、/、*、>、<等。要想把他们用作普通字符,可以使用或单引号来引用他们。单引号内没有替换。双引号用于保留双引号字符串中的空格。

    (四)sh命令

    1.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,则等待所有活动子进程。
    

    2.Linux命令
    sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分。
    echo命令:讲参数字符串作为行回显到stdout
    expr命令:间接更改sh变量的值(数值),讲两个参数字符串转换为数字,然后对数字执行(二进制)操作op,再将得到的数字转换为字符串
    管道命令:在sh脚本中经常使用管道作为过滤器。
    实用命令:除了上面的Linux命令之外,sh还使用许多其他实用程序作为命令。其中包括:
    awk:数据处理程序。
    cmp:比较两个文件。
    comm:选择两个排序文件共有的行。
    grep:匹配一系列文件的模式。
    diff:找出两个文件的差异。
    join:通过使用相同的键来连接记录以比较两个文件。
    sed:流或行编辑命令。
    sort:排序或合并文件。
    tail:打印某个文件的最后n行。
    tr:一对一字符翻译。
    uniq:从文件中删除连续重复行。

    (五)命令替换

    在sh中,(A会被替换成A值。同样,当sh遇到‘cmd’或)(cmd)时,他会先执行cmd,然后用执行的结果字符串替换掉$(cmd)。

    二、sh控制语句

    1.if-else-fi 语句

    if [ condition ] ; then
    statements
    else
    statements
    fi
    

    需要注意的是,在sh中,0为TURE,而非0为FALSE。
    运算符-eq、-ne、-It、-gt等将参数作为整数进行比较。
    除了比较字符串或数值之外,测试程序还可以测试文件操作中经常需要的文件类型和文件属性。

    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,etc.
    if[ f1 -ef f2 ]	test whether f1,f2 are the SAME file
    

    2.if-elif-else-fi复合语句

    if[ condition1 ]: then
    commands
    elif [ condition2 ] ; then
    commands
    else
    commands
    fi
    

    复合条件:与在C语言中一样,sh也允许在符合条件中使用&&(AND)和||(OR),但是语法比C语言更加严格。条件必须用喻队匹配的双括号[[和]]括起来。

    3.for语句

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

    4.while语句

    while[ condition ]
      do
    commands
      done
    

    5.until-do语句

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

    6.case

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

    三、I/O重定向

    当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件。I/O重定向由以下形式和含义:

    file std转向文件,如果文件不存在,将会创建文件。

    file stdout追加到文件。
    <file 将文件用作stdin;文件必须存在并具有r权限。
    <<word 从here文件中获取输入,知道只包含”word”的行。

    四、嵌入文档

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

    五、sh函数

    由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。sh语句
    func s1 s2 ... sn
    调用sh函数,以参数(字符串)形式传递s1~sn。在被调函数中,参数被引用为$0、(1到)n。通常,$0是函数名,$1到 (n是与命令行参数对应的位置参数。函数执行结束时,)?表示其退出状态,如果成功,状态为0,否则,状态为非0。(?值可用函数的显式返回值进行更改。但是,为了测试)?的最后一次执行,必须将其分配给一个变量,然后测试该变量。

    六、sh中的通配符

    星号通配符:sh中最有用的通配符是,可扩展到当前目录中的所有文件。
    示例10.14:
    file
    :列出当前目录中所有文件的信息。
    ls *.c:列出当前目录中所有以.c结尾的文件。
    ?通配符:查询某文件名中的字符
    示例10.15:

    • file ???:有3个字符的所有文件名。
      · 1s .??:一个点号.后有2个字符的所有文件名。
      []通配符:查询文件名中一对[中的字符。
      示例10.16:
      file [ab]:包含字符a或b的所有文件名。 ls [xyz]:列出所有包含x、y或z的文件名。
      ls
      [a-m]*:列出包含a到m范围内字符的所有文件名。

    七、eval语句

    eval[ arg1 arg2 ... argm ]
    eval 是 sh的一个内置命令。它由sh自己执行,而不需要复刻新进程。它将输人参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,然后给出结果字符串供sh执行。

    调试sh脚本

    bash -x mysh

  • 相关阅读:
    20191024-1 每周例行报告
    20191017-1 每周例行报告
    20191010-2 每周例行报告
    梁梦瑶 20190919-4 单元测试
    交换机配置VLAN Cisco packet
    20191128-1 总结
    20191121-1 每周例行报告
    20191114-1 每周例行报告
    对组内成员的感谢博客
    每周例行报告
  • 原文地址:https://www.cnblogs.com/lhpshuaibi/p/15339710.html
Copyright © 2011-2022 走看看