• 学习笔记3


    一、知识点归纳

    1.sh脚本

    sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。例如,我们可以创建一个文本文件mysh
    #!/bin/bash
    # comment line
    echo he11o
    使用chmod+xmysh使其可执行。然后运行mysh。sh脚本的第一行通常以#!组合开始,通常称为shebang。当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。sh有许多不同的版本,例如Linux的bashBSDUnix的csh和IBMAX的ksh等。所有sh程序基本上都执行相同的任务,但它们的脚本在语法上略有不同。shebang允许主sh调用适当版本的sh来执行脚本。如果未指定shebang,它将运行默认的sh,即Linux中的/bin/bash。当bash执行mysh脚本时,将会打印hello。
    sh脚本和C程序有一些相似之处,但它们在根本上是不同的。他们的不同主要表现在以下几个方面:
    (1)sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。而C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。
    (2)在C程序中,每个变量必须有一个类型,例如char、int、float、派生类型(如struct)等。相反,在sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。
    (3)每个C程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。相反,sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的入口点。

    2.命令行参数

    可使用与运行sh命令完全相同的参数调用sh脚本,在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前10个命令行参数可以作为$0-$9被访问。其他参数必须称为$(10)-$(n),其中n>10。或者,可以通过稍后显示的shift命令查看它们。通常,$0是程序名本身,$1到$是程序的参数。在sh中,可用内置变量$#和$计数并显示命令行参数。
    $#=命令行参数$1到$n的数量
    **$
    =所有命令行参数,包括$0**
    此外,sh还有与命令执行相关的以下内置变量。
    $S=执行sh的进程PID
    $?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)

    3.sh变量

    sh有许多内置变量,如PATH、HOME TERM等。除了内置变量外,用户还可使用任何符号作为sh变量。不需要声明。所有的sh变量值都是字符串。未赋值的sh变量是NULL字符串。sh变量可用以下方法设置或赋值:“variable=string”如果A是一个变量,则$A是变量的值。

    4.sh中的引号

    sh有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用或单引号来引用它们。通常,用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

    5.sh语句

    sh语句包括所有Unix/Linux命令,以及可能的I/0重定向。此外,sh编程语言还支持sh程序执行的测试条件、循环、case等语句。

    6.sh命令

    (1)内置命令

    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的输人行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。

    (2)Linux命令

    sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。主要有以下命令:
    echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
    expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
    awk:数据处理程序
    cmp:比较两个文件
    comm:选择两个排序文件共有的行
    grep:匹配一系列文件的模式
    diff:找出两个文件的差异。
    join:通过使用相同的键来连接记录以比较两个文件
    sed:流或行编辑命令
    sort:排序或合并文件
    tail:打印某个文件的最后n行
    tr:一对一字符翻译
    uniq:从文件中删除连续重复行

    7.命令替换

    在sh中,$A会被替换成A值。同样,当sh遇到'cmd'(用引号括起来)或$(cmd)时,它会先执行cmd,然后用执行的结果字符串替换$(cmd)。

    8.sh控制语句

    (1)1if-else-fi语句

    if-else-fi语句的语法是:
    if [ condition ]
    then
    statements
    e1se
    statements
    fi
    每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行

    (2)for语句

    for VARIABLE in string1 string2....stringr
    do
    commands done`
    在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。

    (3)while语句

    sh的while语句类似于C语言中的while循环
    while [ condition ]
    do
    commands
    done
    当条件为真时,sh将重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。

    (4)until-do语句

    该语句类似于C语言中的do-until语句。
    until[ $ANS="give up"]
    do
    echo -n "enter your answer:"
    read ANS
    done

    (5)case 语句

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

    9.I/O重定向

    当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件。I/O重定向有以下形式和含义:
    >file:stdout转向文件,如果文件不存在 将会创建文件。
    >>file:stdout追加到文件。
    <file:将文件用作stdin;文件必须存在并 具有r权限。
    <<word:从“here”文件中获取输人,直到只包含“word”的行。

    10.sh函数

    sh函数的定义为:
    func()
    {
    #function code
    }
    由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。在sh脚本中无法声明函数原型。sh函数的调用方式与sh脚本文件的执行方式完全相同。sh语句fune s1s2... sn调用sh函数,以参数(字符串)形式传递s1~sn。在被调函数中,参数被引用为$0、$1到$n。通常,$0是函数名,$1到$n是与命令行参数对应的位置参数。函数执行结束时,S?表示其退出状态,如果成功,状态为0,否则,状态为非0。$?值可用函数的显式返回值进行更改。

    11.sh中的通配符

    星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件。
    ?通配符:查询某文件名中的字符示例10.15:
    []通配符:查询文件名中一对[]中的字符。

    二、问题与解决思路

    1.sh的更多知识

    shell产生的背景:
    在计算机的早期并没有图形界面,我们只能通过一个一个地命令来控制计算机,这些命令有成百上千之多,且不说记住这些命令非常困难,每天面对没有任何色彩的“黑屏”本身就是一件枯燥的事情。对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。由于安全、复杂、繁琐等原因,用户不能直接接触内核,需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。

    2.shell与C语言的异同

    shell是个脚本语言,也是应用程序与内核进行交互的桥梁(一个让开发者与内核交互的软件)。我们计算机的运行状态等我们是无法肉眼来查看的,但是通过shell我们就能看到他的数据。而C语言是另一种高级的计算机语言,他可以开发很多软件,shell也是用c语言写的。

  • 相关阅读:
    qemu 系列
    vuex
    gpio led学习
    [Java] 容器-03 增强的For循环 / Set 方法
    [Java] 容器-02 HashSet 类 / Iterator 接口
    [Java] 容器-01 实现 Comparable 接口 / 重写 equals 与 hashCode (1个图 1个类 3个知识点 6个接口)
    [Java] 常用类-03 File 类 (io 包中的 File) / Enum 类
    [Java] 常用类-02 基础数据类型包装类 / Math 类
    [Java] 常用类-01 String / StringBuffer
    [Java] 数组-05 binarySearch / TestArrayCopy
  • 原文地址:https://www.cnblogs.com/ffffatal/p/15335659.html
Copyright © 2020-2023  润新知