一、Shell简介

        随着各式Linux系统的图形化程度的不断提高,用户在桌面环境下,通过点击、拖拽等操作就可以完成大部分的工作。然而,许多Ubuntu Linux功能使用Shell命令来实现,要比使用图形界面交互,完成的更快、更直接。英文单词Shell可直译为“贝壳”。“贝壳”是动物作为外在保护的一种工具。可以这样认为,Linux中的Shell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互

        命令是用户向系统内核发出控制请求,与之交互的文本流。Shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互。同时,Shell为操作系统提供了内核之上的功能,直接用来管理和运行系统。当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成为Shell脚本文件,交给Shell批量执行。

1、Shell交互过程

  • 用户在命令行提示符下键入命令文本,开始与Shell进行交互。
  • 接着,Shell将用户的命令或按键转化成内核所能够理解的指令
  • 控制操作系统做出响应,直到控制相关硬件设备。
  • 然后,Shell将输出结果通过Shell提交给用户。

2、选择Shell

        最初的UNIX Shell经过多年的发展,由不同的机构、针对不同的目的,开发出许多不同类型的Shell程序。目前流行的Shell主要有几种 :

        Bourne Shell(简称sh):Bourne Shell由AT&T贝尔实验室的S.R.Bourne开发,也因开发者的姓名而得名。它是Unix的第一个Shell程序,早已成为工业标准。目前几乎所有的Linux系统都支持它。不过Bourne Shell的作业控制功能薄弱,且不支持别名与历史记录等功能。目前大多操作系统是将其作为应急Shell使用。

        C Shell(简称csh):C Shell由加利福尼亚大学伯克利分校开发。最初开发的目的是改进Bourne Shell的一些缺点,并使Shell脚本的编程风格类似于C语言,因而受到广大C程序员的拥护。不过C Shell的健壮性不如Bourne Shell。

        Korn Shell(简称ksh):Korn Shell由David Korn开发,解决了Bourne Shell的用户交互问题,并克服了C Shell的脚本编程怪癖的缺点。Korn Shell的缺点是需要许可证,这导致它应用范围不如Bourne Shell广泛。

        Bourne Again Shell(简称bash):Bourne Again Shell由AT&T贝尔实验室开发,是Bourne Shell的增强版。随着几年的不断完善,已经成为最流行的Shell。它包括了早期的Bourne Shell和Korn Shell的原始功能,以及某些C Shell脚本语言的特性。此外,它还具有以下特点:能够提供环境变量以配置用户Shell环境,支持历史记录,内置算术功能,支持通配符表达式,将常用命令内置简化。

3、编译型语言与解释型语言

        编译型语言:需要使用编译器进行编译,之后才可以执行的语言 , 源文件是不能直接执行的

        常用的编译型语言有: c , c++,java,c# ,vb , asm, go

        解释型语言:不需要编译, 直接可以运行的语言, 源文件可以直接运行的语言

        常用的解释性语言有: python , javascript ,PHP, sql , shell, html

        Shell脚本(角色扮演的剧本, 角本,脚本)语言是解释型语言。

        Shell脚本的本质:Shell命令的有序集合。

二、shell 编程的基本过程

1、编写shell程序步骤

        1. 第一步,建立 shell 文件, shell 文件的后缀名是.sh , 或则不写。包含任意多行操作系统命令或shell命令的文本文件

        2. 赋予shell文件执行权限 (x),用chmod命令修改权限;

        3. 执行shell文件,直接在命令行上调用shell程序

2、shell程序

三、Shell变量

        Shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符。

        命名规则同C语言中的命名规则

        Bourne Shell有如下四种变量:用户自定义变量、位置变量即命令行参数、预定义变量、环境变量。

1、用户自定义变量

        在shell编程中通常使用全大写变量,方便识别

        变量的调用:在变量前加$

        bash从右向左赋值

        使用unset命令删除变量的赋值

2、位置变量

3、编程练习位置变量

4、常用shell环境变量

5、编程练习- 环境变量

四、shell 控制语句

1、Shell程序

        shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。

        说明性语句: 以#号开始到该行结束,不被解释执行

        功能性语句: 任意的shell命令、用户程序或其它shell程序。

        结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等。

        说明性语句 必不可少的: #! /bin/bash

2、输入与输出

  • 输出: echo
  • 输入: read

        read 命令:read 从标准输入读入一行, 并赋值给后面的变量,等价于c语言的scanf。把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量。如果执行read语句时标准输入无数据,,则程序在此停留等侯,直到数据的到来或被终止运行。

        把读入的数据全部赋给var

3、输入与输出

4、expr 命令

        算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘( \* )、整除(/)和求模(%)等操作。

5、test命令

        test语句可测试三种对象:字符串 整数 文件属性

        字符串测试

        整数测试

        测试文件

6、编程练习 - 判断y/n

        从终端输入的y/n , 读取用户输入的是y还是n

7、编程练习 - 比较2个数

        输入2个数, 比较2个数之间的关系(> , >= , <, <=, ==, != )

8、判断文件

        测试文件的属性 , 文价是否存在 , 文件的类型(BCD-LSP), 文件的读写权限(rwx)

9、test命令的替代写法[]

        在程序中可以 使用 [ ] 替代test 命令 , 这种用法就是 test 的缩写

10、条件语句

  • if ... then ...fi

        如果表达式为真,,则执行命令表中的命令; 否则退出if语句,即执行fi后面的语句。if和fi是条件语句的语句括号,必须成对使用;命令表中的命令可以是一条,,也可以是若干条。

  • if…then…else…fi

        如果表达式为真, 则执行命令表1中的命令;否则执行命令表2中的语句.

  • if…then…elif ... then ... else…fi

        如果表达式1为真,则执行命令表1中的命令, 再退出if语句;否则执行命令表2中的语句, 再退出if语句.

  • case…esac

        多路分支语句case用于多重条件测试, 语法结构清晰自然. 其语法为:

11、循环结构

  • for…do…done

        当循环次数已知或确定时, 使用for循环语句来多次执行一条或一组命令。 循环体由语句括号do和done来限定。变量依次取单词表中的各个单词, 每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词数确定,命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

  • while…do…done

        while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。while语句的退出状态为命令表中被执行的最后一条命令的退出状态。

        计算1+2+3+4+...+100 之和

  • until…do…done

        until循环与while循环的功能相似, 所不同的是只有当测试的命令或表达式的值是假时, 才执行循环体中的命令表, 否则退出循环. 这一点与while命令正好相反.

  • break 和 continue

        break n 则跳出n层;continue语句则马上转到最近一层循环语句的下一轮循环上,continue n则转到最近n层循环语句的下一轮循环上.

五、shell 函数

1、函数

        在shell程序中, 常常把完成固定功能、且多次使用的一组命令(语句)封装在一个函数里,每当要使用该功能时只需调用该函数名即可。函数在调用前必须先定义,即在顺序上函数说明必须放在调用程序的前面。调用程序可传递参数给函数, 函数可用return语句把运行结果返回给调用程序。函数只在当前shell中起作用,不能输出到子Shell中。

2、局部变量与全局变量

        声明局部变量的格式:

local variable_name =value

        全局作用域:在脚本的其他任何地方都能够访问该变量。

variable_name =value

六、shell 调试方法

        分析输出的错误信息。通过在脚本中加入调试语句,输出调试信息来辅助诊断错误。功能:set -x , set +x 跟踪程序的每一步的执行结果

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐