学习笔记3(20191222何雨蔚)

学习笔记 3

sh编程

sh脚本

  • sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。

  • sh脚本的第一行通常以 #!组合开始,通常称为shebang。

  • 如果未指定shebang,将运行默认的sh,即Linux中的/bin/bash。

例:
#! /bin/bash
# comment line
echo hello
使用chmod +x mysh使其可执行。当bash执行该脚本时,将会打印hello。

sh脚本与c程序

区别:

  • sh:

(1)sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。
(2)sh脚本中,每个变量都是字符串。
(3)sh脚本不需要main函数,第一个可执行语句是程序的入口点。

  • C程序:

(1)C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。
(2)在C程序中,每个变量必须有一个类型,例如char、int、float、派生类型(如struct)等。
(3)必须拥有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。

命令行参数

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

  • $#=命令行参数$1到Sn的数量
  • $*=所有命令行参数,包括$O
  • $S=执行sh的进程PID
  • $?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)

*在sh中,特殊字符$表示替换。要按原样使用$,它必须带有单引号或反引号\。

sh变量

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

sh中的引号

  • sh有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。

  • 通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

sh语句

  • sh语句包括所有Unix/Linux命令,以及可能的I/0重定向。

  • 此外,sh编程语言还支持sh程序执行的测试条件、循环、case等语句。

sh命令

  1. 内置命令
    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脚本中。下文列出并解释了其中一些命令。
    eho命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。
    expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值。
    实用命令:除了上面的 Linux命令之外,sh还用许多其他实用程序作为命令。其中包括除了上面的Linux命令之外,sh还用许多其他实用程序作为命令。其中包括:
    awk:数据处理程序
    cmp:比较两个文件
    comm:选择两个排序文件共有的行
    grep:匹配一系列文件的模式
    diff:找出两个文件的差异。
    join:通过使用相同的键来连接记录以比较两个文件
    sed:流或行编辑命令
    sort:排序或合并文件
    tail:打印某个文件的最后n行
    tr:一对一字符翻译
    uniq:从文件中删除连续重复行

命令替换

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

sh控制语句

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

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

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

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

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

  • case语句
    case $variable in
    pattern1) command;;
    pattern2) command;;
    patternN) command;;
    esac

  • 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脚本中,以生成长块的描述性文本,不需要分别回显每一行。

sh函数

sh函数的定义为:
func()
{
#function code
}
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。
在sh脚本中无法声明函数原型。
sh函数的调用方式与sh脚本文件的执行方式完全相同。

sh中的通配符

  • 星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件。

  • ?通配符:查询某文件名中的字符。

  • [ ]通配符:查询文件名中一对[ ]中的字符。

命令分组

在sh脚本中,可以用{}或()对命令进行分组。

eval语句

eval是sh的一个内置命令。由sh自己执行,不需要复刻新进程。它将输入参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,然后给出结果字符串供sh执行。

sh脚本

可由带有-x选项的子sh运行,以进行调试。

问题与解决思路

1、总结一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
要素:
(1)数据类型
(2)常量
(3)变量
(4)运算符
(5)表达式
(6)标识符
(7)关键字
(8)数组
(9)基本控制结构
(10)函数
(11)输入和输出
(12)解释器和编译器
技能:
(1)数据结构的分析和设计
(2)算法(即处理逻辑,微观层次)的分析和设计
(3)系统架构(即处理逻辑,宏观层次)的分析和设计
shell脚本:
(1)用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
(2)提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
2、脚本是什么意思?sh脚本与sh有什么区别?
根据百度百科的解释,脚本是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。 Shell是一种命令语言,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面。
3、内置命令和外部命令的区别?
内置命令就是Bash Shell 自带的命令,外部命名是 Linux 系统中的应用程序。
内置命令的执行效率和资源消耗都优于外部命令。

posted @ 2021-09-26 19:32  Kylin0  阅读(65)  评论(0编辑  收藏  举报