• 20191325施羿第十章学习笔记


    sh编程

    shell与shellscript的区别联系

    shell

    Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

    1.shellscript

    Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

    业界所说的 shell 通常都是指 shell 脚本。

    sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句;C程序与其在根本上是不同的。首先,sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行,相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件;其次,在C程序中,每个变量必须有个类型,相反,在sh脚本中,每个变量都是字符串;最后,每个C程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数,相反,sh脚本不需要main函数。

    2.命令行参数

    可使用与运行sh命令完全相同的参数调用sh脚本,在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。前10个命令行参数可以作为$0-$9被访问。其他参数必须称为$(10)-$(n),其中n>10。或者,可以通过稍后显示的shift命令查看它们。通常,$0是程序名本身,$1到$9是程序的参数。在sh中,可用内置变量$#和$计数并显示命令行参数。

    内置变量

    $#=命令行参数的数量(1-n)

    $*=所有命令行参数,包括$0

    $S=执行sh的进程PID

    $?=最后一个命令执行的退出状态(if success, set 0)

     

    3.sh变量

    内置变量有PATH、HOME、TERM等,除此之外,用户还可使用任何符号作为sh变量,未赋值的sh变量是NULL字符串。

    4.sh中的引号

    sh有许多特殊字符,如$、/、*、>、<等。

    作为普通字符,可使用或单引号。

    通常,用于引用单个字符。

    单引号用于引用长字符串。

    单引号内没有替换。

    双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

    5.sh语句

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

    6.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:将位置参数$2 $3...重命名为$1 $2.... trap[arg]:接收到信号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语句

    每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行

    (2)for语句

    在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。

    (3)while语句

    (4)until-do语句

    该语句类似于C语言中的do-until语句。

    (5)case 语句

     

    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逐行执行命令,所以必须在任何可执行语句之前定义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: []通配符:查询文件名中一对[]中的字符。

    二、问题与解决思路

     

  • 相关阅读:
    at org.apache.catalina.loader.WebappClassLoader.loadClass问题处理
    java ee 中文乱码的问题
    java.lang.IllegalStateException: getWriter() has already been called for this response问题解决
    Project Euler Problem 23 Non-abundant sums
    Project Euler Problem 24 Lexicographic permutations
    Project Euler Problem 19 Counting Sundays
    CCF201703-2 学生排队(100分)
    Project Euler Problem 17 Number letter counts
    CCF201703-1 分蛋糕(100分)
    Project Euler Problem 92 Square digit chains
  • 原文地址:https://www.cnblogs.com/2902480848sy/p/15340017.html
Copyright © 2020-2023  润新知