• 学习笔记3


    一、sh脚本
    创建一个文本文件mysh,包含:

    I /bin/bash

    comment line

    echo hello
    使用chmod +x mysh使其可执行
    二、sh脚本与C程序
    首先,Sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行 命令且为内置命令,那么Sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反,C程序必须先编译链接到一 个二进制可执行文件.然后通过主sh的子进程运行二进制可执行文件。其次,在C程序中, 每个变量必须有一个类型,例如char、int、float、派生类型(如struct)等。相反,在sh脚 本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。最后,每个 C程序必须有一个main。函数,每个函数必须定义一个返回值类型和参数(如有)。相反, sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的入口点。
    三、命令行参数
    $# =命令行参数$ 1到$n的数量
    $* =所有命令行参数,包括$0
    此外,sh还有与命令执行相关的以下内置变量。
    SS =执行sh的进程PID
    $?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0 )
    四、sh变量
    PATH、HOME、TERM等。除了内置变量外,用户还可使用 任何符号作为sh变量。可用以下方法设置或赋值:

    NOTE: no white spaces allowed between tokens

    如果A是一个变量,则$A是变量的值。 示例10.2:

    (null if variable A is not set)

    set A value

    this is fun

    assign "A" to B

    A (B was assigned the string "A")
    (B takes the VALUE of A) this is fun
    五、sh中的引号
    Sh有许多特殊字符,如$、/、、>、〈等。要想把它们用作普通字符,可使用 '或单引 号来引用它们。用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。
    六、sh语句
    sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。
    Is
    Is > outfile date
    cp fl f2
    mkdir newdir cat < filename
    七、sh命令
    1.内置命令
    ・.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:将位置参数S2 $3 ...重命名为$1 S2…。
    ° trap [arg] [n]:接收到信号n后执行参数。
    •umask [ddd]:将掩码设置为八进制数ddd的。
    ・wait [pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
    read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为 几个标记,分配给列岀的变量。read的一个常见用法是允许用户与正在执行的sh进行交互, 如下面的示例所示。
    echo -n "enter yes or no : " # wait for user input line from stdin
    read ANS # sh reads a line from stdin
    echo $ANS # display the input string
    在获得输入后,Sh可能会测试输入字符串,以决定下一步做什么。
    2.Linux 命令
    echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压 缩为一个空格,除非有引号。
    echo This is a line # display This is a line
    echo "This is a line
    # display This is a line
    echo -n hi # display hi without NEWLINE
    echo there # display hithere

    实用命令:除了上面的Linux命令之外,sh还使用许多其他实用程序作为命令。其中 包括:
    ・awk:数据处理程序。
    •cmp:比较两个文件。
    ・comm:选择两个排序文件共有的行。
    •grep:匹配一系列文件的模式。
    ・diff:找出两个文件的差异。
    •join:通过使用相同的键来连接记录以比较两个文件。
    , sed:流或行编辑命令。
    •sort:排序或合并文件。
    •tail:打印某个文件的最后n行。
    -tr: 一对一字符翻译。
    ・uniq:从文件中删除连续重复行。
    八、命令替换
    九、sh控制语句
    1.If-else-fi语句
    ●if-else-fi语句的语法是:
    if [ condition ] # NOTE: must have white space between tokens
    then
    statements
    else # as usual, the else part is optional
    statements
    fl # each i£ must end with a matching fl
    ●实际上,if-else-fi语句通常写成:
    if [ condition ]; then
    statements
    else
    statements
    fi
    ●作为字符串进行比较:
    if [ si = s2 ] # NOTE: white spaces needed between tokens
    if [ si 1= s2 ]
    if [ si < s2 ] # < because < is a special char
    if [ si > s2 ] etc. # > because > is a special char

    ●测试程序还可以测试文件操作中经常需要的文件类型和文件属性。

    test whether file name exists

    test whether name is a (REG) file

    test whether name is a DIR

    test whether name is readable; similarly for -w, -xr etc.

    test whether fl, £2 are the SAME file

    2.for语句
    for VARIABLE in stringl string2 .・・・ stringn
    do
    commands
    Done
    3.while语句
    while [ condition ]
    do
    commands
    done
    4.until-do 语句
    until [ $ANS = "give upn ]
    do
    echo -n "enter your answer :"
    read ANS
    done
    5.case 语句
    十、I/O重定向

    file stdout转向文件,如果文件不存在,将会创建文件。
    » file stdout追加到文件。
    <file 将文件用作stdin;文件必须存在并具有r权限。
    « word 从11 here"文件中获取输入,直到只包含“word”的行。
    十一、嵌入文档
    十二、sh函数
    sh函数的定义为:
    func()
    (

    function code

    }
    十三、sh中的通配符
    星号通配符:sh中最有用的通配符是,可扩展到当前目录中的所有文件。
    ・file
    :列出当前目录中所有文件的信息。
    •Is .c:列出当前目录中所有以.c结尾的文件。
    ?通配符:查询某文件名中的字符
    示例10.15:
    ・file ???:有3个字符的所有文件名。
    -Is
    .??: 一个点号.后有2个字符的所有文件名。
    []通配符:查询文件名中一对[]中的字符。
    示例10.16:
    •file[ab];包含字符a或b的所有文件名。
    •Is [xyz]:列出所有包含x、y或z的文件名。
    ls[a-m]:列出包含a到m范围内字符的所有文件名。
    十四、命令分组
    在Sh脚本中,可以用{}或。对命令进行分组。
    (ls;mkdir abc;ls;}:通过当前sh执行{}中的命令列表。{}命令分组的唯一用处是在相 同环境下执行这些命令,例如,为分组中的所有命令重定向1/0。
    更有用的命令分组是(),由subsh (进程)执行。
    (cd newdir;ls;A=value;mkdir SA):通过subsh进程执行()中的命令。subsh进程可在不 影响父sh的情况下更改其工作目录。此外,当subsh进程终止时,subsh中的任何赋值变量 都不起作用。
    十五、eval 语句
    sh在执行命令行之前,按以下步骤计算该命令行。
    (1)参数替换:扫描命令行,将任何$乂替换为它的值,但只执行一次,即不能再次替 换任何产生的$符号。命令行变成:
    cp $B 'pwd'/newdir
    (2)命令替换:用替换执行'pwd'o sh将会执行结果行
    cp $B /root/newdir
    如果当前目录没有任何名为$日的文件,则会导致一个错误。但是,如果我们将原来的 命令行更改为
    eval cp $A $(pwd)/$C
    Sh将会在执行命令行之前先计算它。计算完成后,该命令行变成:
    cp abc* /root/newdir
    (3)通配符扩展:当sh执行该行时,它将new*展开为以abc开头的文件名。这将会把 所有以abc开头的文件名复制到目标目录中。
    需要注意的是,我们总是可以通过一些额外的语句来实现与手动计算相同的效果。使用 eval可以省去一些替换语句,但也可能使代码难以理解。因此,应避免使用任何不必要的 evaL
    十六、编程项目:用sh脚本递归复制文件
    (1) n<2:显示用法并退出。
    (2) n>2: fn必须是现有目录。
    (3)n=2:将文件复制到文件,将文件复制到目录,或者将目录1复制到目录2。
    (4)永远不要将文件或目录复制到它本身。此外,如果目录2是目录1的派生目录,不要进行复制。

    实验截图



  • 相关阅读:
    MVC Form
    The way to learn english
    Test FastThree
    C#中Trim()、TrimStart()、TrimEnd()的用法
    c# Dictionary 简介
    visual studio快捷键大全
    ASP.NET MVC 中 ActionResult
    MVC4中使用 Ninject
    MVC Chapter 12 Overview of MVC Projects
    ASP.NET Razor
  • 原文地址:https://www.cnblogs.com/marryj/p/16704400.html
Copyright © 2020-2023  润新知