• 《Unix/Linux系统编程》学习笔记3


    第十章 sh编程

    一. 知识点归纳

    (一)sh脚本

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

    shebang(#!)的一些具体用法:

    1. 如果脚本文件中没有#!这一行,那么执行时会默认采用当前Shell去解释这个脚本(即:$SHELL环境变量)。
    2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。
    3. 如果#!指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission
      denied”。如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。
    4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到$PATH中寻找解释器的。
    5. 当然,如果你使用类似于”bash test.sh”这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的bash。
    6. 脚本文件必须拥有可执行权限。

    (二)sh脚本与C程序

    - sh:

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

    - C程序:

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

    (三)echo

    • n:不要自动换行
    • e:若出现某个字符。特殊处理
    • \a:发出警告声
    • \c:不换行
    • \n:换行且光标移动到行首
    • \t:插入tab
    • -help:显示版本信息

    (四)sh变量

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

    (五)sh中的引号

    • sh有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。
    • 通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有替换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

    (六)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进行交互。

    - Linux命令

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

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

    (七)sh控制语句

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

    1. if-else-if语句

    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

    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”的行。

    二. 问题与解决思路

    1. 一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如何呈现出来的?

    - 要素:

    • 数据类型
    • 常量
    • 变量
    • 运算符
    • 表达式
    • 标识符
    • 关键字
    • 数组
    • 基本控制结构
    • 函数
    • 输入和输出
    • 解释器和编译器

    - 技能:

    1. 数据结构的分析和设计
    2. 算法(即处理逻辑,微观层次)的分析和设计
    3. 系统架构(即处理逻辑,宏观层次)的分析和设计

    - shell脚本:

    1. 用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的
    2. 提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。

    三.实践内容与截图

    1.sh脚本

    image
    image

    2.sh变量

    image
    image

    3.sh条件语句

    image
    image

  • 相关阅读:
    SpringCloud之Eureka注册中心原理及其搭建
    微服务架构及其概念
    SpringBoot(十六)-----Springboot整合JPA
    SpringBoot(十五)-----Springboot配合JDBCTemplate实现增删改查
    MYSQL安装报错 -- 出现Failed to find valid data directory.
    SpringBoot(十四)-----异常处理
    JQuery 隔行变色
    C#断开式连接
    C# 学生表的插入操作
    C#字符串
  • 原文地址:https://www.cnblogs.com/20201212ycy/p/16696770.html
Copyright © 2020-2023  润新知