Unix/Linux系统编程学习笔记-3

笔记

第十章 sh编程

sh脚本与C程序

两者对比:

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

命令行参数:

  • $# = 命令行参数$1到$n的数量
  • ¥* = 所有命令行参数,包括$0
  • 此外,sh还有与命令执行相关的以下内置变量。
  • $S = 执行sh的进程PID
  • $? = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0)

sh变量设置或赋值:

variable=string #NOTE: no white spaces allowed between tokens

sh中引号:

若想把$、/、*、>、<等用作普通字符,可使用\或单引号来引导。
如:

  • echo $A
  • echo '$A'
  • echo "see $A"

sh语句

包括所有Unix/Linux命令,以及可能的I/O重定向

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:将位置参数23...重命名为12....
  • trap[arg][n]:接收到信号n后执行参数
  • umask[ddd]:将掩码设置为八进制数ddd的
  • wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。
  • read命令:当sh执行read命令时,它会等待来自stdin的输人行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互。

Linux命令:

  • sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。下文列出并解释了其中一些命令。
  • echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
  • expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
  • 管道命令:在sh脚本中经常使用管道作为过滤器。

实用命令:除了上面的 Linux命令之外,sh还用许多其他实用程序作为命令。其中包括除了上面的Linux命令之外,sh还用许多其他实用程序作为命令。其中包括:

  • awk:数据处理程序
  • cmp:比较两个文件
  • comm:选择两个排序文件共有的行
  • grep:匹配一系列文件的模式
  • diff:找出两个文件的差异。
  • join:通过使用相同的键来连接记录以比较两个文件
  • sed:流或行编辑命令
  • sort:排序或合并文件
  • tail:打印某个文件的最后n行
  • tr:一对一字符翻译
  • uniq:从文件中删除连续重复行

命令替换

  • 当sh遇到'cmd'(用引号括起来)或$(cmd)时,它会先执行cmd,然后用执行的结构字符串替换$(cmd)。

sh控制语句:

sh是一种编程语言,支持许多执行控制语句,类似于c语言中的语句。

  • 1.if-else-fi语句:
    if [ condition ]
    then
    statements
    else
    statements
    fi
    每个语句必须在单独的一行上。但是,如果多个语句之间用分号分开,则sh允许多个语句在同一行.
  • 2.for语句 :
    for VARIABLE in string1 string2....stringr
    do
    commands
    done
    在每次迭代中,变量接受一个参数字符串值,并执行关键字do和done之间的命令。
  • 3.while语句:
    while [ condition ]
    do
    commands
    done
    当条件为真时,sh将重复执行do-done关键字中的命令。预计条件会有变化,所以循环将在某个时间点退出。
  • 4.until-do 语句:
    until[ $ANS="give up"]
    do
    echo -n "enter your answer:"
    read ANS
    done
    该语句类似于C语言中的do-until语句。
  • 5.case语句:
    case $variable in
    pattern1) command;;
    pattern2) command;;
    patternN) command;;
    esac
    该语句类似C语言中的case语句,但在sh编程中很少使用。
  • 6.continue和break语句:
    工作原理与C语言中完全相同。

I/O重定向

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

  • ›file:stdout转向文件,如果文件不存在将会创建文件。
  • ››file:stdout追加到文件。
  • <file:将文件用作stdin;文件必须存在并具有r权限。
  • <<word:从“here”文件中获取输人,直到只包含“word”的行。

嵌入文档

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

sh中的通配符:

常见通配符如下:

问题与解决思路

大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如何呈现出来的?

要素:

  • 1.语法部分
  • 2.关键字和保留字部分
  • 3.变量部分
  • 4.数据类型部分
  • 5.操作符部分
  • 6.语句部分
  • 7.函数部分
  • 8.复合类型部分

技能:

  • 1.面对对象设计
  • 2.具体系统架构
  • 3.数据结构和算法
  • 4.开发平台及相关技术
  • 5.数据库基础知识
  • 6.调试并能够检验bug

在shell脚本中是如何呈现出来?

在对本章学习的过程中,我们发现shell脚本的使用有部分内容都和C语言程序有着类似之处,我们可以在p247于sh脚本的应用得出答案。

实践内容与截图

sh的练习使用:

sh的if-else-fi语句的使用:

posted @ 2022-09-17 16:31  20201224吴卓航  阅读(38)  评论(0编辑  收藏  举报