zoukankan      html  css  js  c++  java
  • 学习笔记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语言写的。

  • 相关阅读:
    解决 Mac launchpad 启动台 Gitter 图标无法删除的问题
    React 与 React-Native 使用同一个 meteor 后台
    解决 React-Native mac 运行报错 error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by ope
    一行命令更新所有 npm 依赖包
    swift学习笔记
    IOS语言总结
    focusSNS学习笔记
    别小看锤子,老罗真的很认真
    windowsphone开发页面跳转到另一个dll中的页面
    【令人振奋】【转】微软潘正磊谈DevOps、Visual Studio 2013新功能、.NET未来
  • 原文地址:https://www.cnblogs.com/ffffatal/p/15335659.html
Copyright © 2011-2022 走看看