《Linux操作系统编程》第七章 shell的交互功能: 了解shell的启动过程,shell的功能,shell的命令形式,shell程序的建立和运行,理解管道和重定向,环境变量和系统变量以及变量引用

简介: 《Linux操作系统编程》第七章 shell的交互功能: 了解shell的启动过程,shell的功能,shell的命令形式,shell程序的建立和运行,理解管道和重定向,环境变量和系统变量以及变量引用

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁

🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥


第七章 shell的交互功能

学习目的

让学生了解shell的启动过程,shell的功能,shell的命令形式,shell程序的建立和运行,理解管道和重定向,环境变量和系统变量以及变量引用方式。

学习要求

了解:shell的启动过程,shell的功能,shell的命令形式,shell程序的建立和运行

理解:管道和重定向,环境变量和系统变量以及变量引用方式;

掌握: 输入输出重定向的使用和命令组合,shell的三种变量类型——环境变量、系统变量和自定义变量的使用。

学习方法

应用已有功能解决常见管理维护需求的能力,尤其是利用shell编程解决问题的能力。

概念和原理

7.1 shell的功能与分类

7.1.1 shell的定义

Linux操作系统由内核、shell、文件系统和一些实用程序构成。

Shell是指“为使用者提供操作界面”的软件,通常指的是命令行界面的解析器。

Shell 是连接用户和 Linux 内核的程序,它不仅是Linux系统与用户之间的桥梁,还是一种程序设计语言。

7.1.2 shell的功能

▪ 命令解释器:解释用户发出的各种操作系统命令

▪ 程序设计语言:功能强大, 可包容引用所有的操作系统命令和可执行程序。

7.1.3 shell的分类

▪ Bourne Shell (sh)

▪ C shell (csh)

▪ Korn shell (ksh)

拓展

▪ Bourne Again shell(bash, sh 的扩展)

▪ tcsh (csh 的扩展)

▪ Public Domain Korn shell(pdksh, ksh 的扩展)

7.2 shell的启动与执行

7.2.1 shell的启动

▪ Linux预置七种init运行级别(0-6)

- 0:关机模式 (相当于poweroff)

- 1:单用户模式

- 2:无网络支持的多用户模式

- 3:有网络支持的多用户模式(也就是文本模式,工作中最常用的模式)

- 4:保留,未使用

- 5:有网络支持的X-windows支持多用户模式(也就是桌面图形模式)

- 6: 重新引导系统,即重启 (相当于reboot)

▪ 当以telent或者ssh登入主机时,系统会出现一个login的画面让用户输入账号

▪ 输入账号与密码之后,Linux会:

- 先找寻/etc/passwd里面是否有这个账号,如果没有则跳出,如果有的话则将该账号对应的UID(User ID)与GID(Group ID)读出来,另外,该账号的home目录与Shell设定也一并读出;

- 核对密码表,这时Linux会进入/etc/shadow里面找出对应的账号与UID,然后核对一下输入的密码与里头的密码是否相符;

- 如果符合,就进入Shell管控的阶段;

- 终端屏幕上显示提示符“$”,表明shell已经启动完毕,等待用户的键盘命令。

7.2.2 shell 解释执行键盘命令的过程

图7-1 shell 解释执行键盘命令的过程

7.3 shell命令类型

(1) 单条命令

- 这是最常用命令形式,在一个命令行上的只包含一条命令(包括命令名以及可能有的命令行任选项和命令行参数等)。

- $ who -H

(2) 串行命令

- 串行命令就是在一个命令行中包含多条由分号(;)隔开的简单命令。

- 第一条命令执行完成后, (无停顿)再执行第二条命令, 如此下去. 运行功能和效果与在键盘上逐条输入命令并运行是完全一样的。

- 主要目的是提高键盘命令输入效率。

- $ pwd; who; date

(3) 复合命令(命令组)

  1. 管道形式:管道前后的命令任意组合、同时运行, 形成功能更强大灵活的复合命令.
  2. 圆括号形式:括号内的命令任意组合、顺序执行,且由一个子shell来单独控制运行, 相当于一个小的功能程序. 方便灵活, 运行效率高.
  3. 复合命令:管道(用符号“|”表示)用于连接两条命令,把第一条命令的运行结果传送给第二条命令作为其运行参数。

(4) 后台命令

- 后台命令,就是 shell启动该命令的执行后,不等待该命令执行完毕,就立即开始接收新的键盘命令。

- 普通命令行的行尾加上&符号,就表示该命令在后台执行。

7.4 标准输入/输出重定向

7.4.1 标准输入/输出重定向

(1) 标准输入/输出

▪ 标准输入: 键盘 fd = 0

▪ 标准输出: 荧光屏 fd = 1

▪ 标准错误输出: 荧光屏 fd = 2

(2) 标准输入重定向

command < filename

进程的输入来自文件filename。

(3) 标准输出重定向

▪ 覆盖形式

command > filename

进程输出覆盖文件filename

▪ 追加形式

command >> filename

进程输出追加到文件filename后面, 不覆盖filename

(4) 标准错误输出重定向

command 2> filename

进程运行中的错误信息重定向到文件filename。

(5) 标准输入/输出/错误输出重定向混用

grep student < name_list > course

其意义是找出 name_list 文件中包含 student 字符串的行,并将查找的结果保存到course文件中去。

(6) 常见输入输出重定向形式

命令 输入 输出 效果
cat 键盘 屏幕 将键盘输入显示在屏幕上
cat file1 file1 屏幕 file1的内容显示在屏幕上
cat file1 > file2 file1 file2 file1的内容写入file2中
cat > file2 键盘 file2 键盘输入的内容写入file2
cat < file1 file1 屏幕 file1的内容显示在屏幕上
cat < file1 > file2 file1 file2 file1的内容写入file2中

(7) 管道

管道用于连接两个命令, 它把前一个命令的标准输出重定向给后一个命令作为标准输入,其格式为:

command1 | command2

▪ 对command1来说标准输出被重新定向到管道文件

▪ 对command2来说标准输入也被重新定向为管道文件.

7.5 shell的内部命令

7.5.1 shell的内部命令

shell 的内部命令包含在shell内部, 不是一条单独的操作系统命令, 因此无法在文件系统中查找到。

shell 包含几十条内部命令。在 bash 环境下,输入 help 命令(这也是一条内部命令),就可列出bash的所有内部命令。

可以使用 type 来确定一个命令是否是内建命令

(1) time命令

▪ time命令可放在任何命令或可执行程序的前面,显示当前shell运行命令所花费的时间。time 命令使用方式就是在普通命令的前面加上 time即可。

$ time ls –lR /usr > flist

real 2m 17.32s 该ls进程的总运行时间

user 0m 7.63s 其中用户程序部分的运行时间

sys 0m 6.79s 其中操作系统核心部分运行时间

(2) echo命令

▪ echo命令主要用于显示后面的字符串或变量的值

$ echo Hello World!

Hello World!

▪ 如果 echo 后面有多个由空格隔开的字符串,则 echo 把这些参数都作为单独的命令行参数(字符串)来处理,显示时各个参数之间就只保留一个空格。

$ echo this is a test line

this is a test line

▪ 如果就是要保留 echo后面的多个字符串的格式(多个空格),就需要把这些字符串用双引号括起来,表示为一个完整的字符串。

$ echo “this is a test line”

this is a test linet

▪ 常用的转义字符

图7-2 常用的转义字符

7.6 shell的变量

7.6.1 shell的变量

每一个shell都可以设定一组变量来限定shell及其子程序的功能模式和取值范围

shell的变量有三种类型:环境变量、系统变量和用户自定义变量。

shell的环境变量也称为标准变量,由系统定义并赋有初值,用户可以直接使用这些变量的初值,也可以修改这些变量的值。

系统的基本环境变量放在/etc/profile中, 用户环境变量放在用户主目录下的.profile文件中, 用户shell启动时, 先执行/etc/profile, 再执行用户主目录下的.profile。

环境变量可在shell运行时动态修改。

(1) 常用的shell环境变量及实例

▪ HOME变量

HOME=/home/ly 用户主目录, 注册时的初始目录

▪ PATH变量

PATH=/bin:/usr/bin:./ 键盘命令的搜索路径

▪ SHELL变量

SHELL=/bin/sh 用户的初始shell的路径名称

▪ TERM变量

TERM=vt100 当前所用的终端类型

▪ PS1变量

PS1=$ shell的主提示符

▪ IFS变量

IFS= 域分隔符, 通常为空格(不可显示字符), 用来分隔命令行各个域

(2) echo命令的使用

echo命令的基本功能就是在标准输出上显示后面的字符串,或变量的值。当字符串中带空白符或其它控制字符时,用引号将其括起来。

例如:

$ echo 12345

12345

$ echo “department computer”

department computer

$ echo “My home directory is: $HOME”

My home directory is: /usr/teacher/david

$ echo –n “Input your choice (y/n) [ ]\b\b”

Input your choice (y/n) [ _ ]

(3) set命令的使用

如果要查看当前用户的所有环境变量的设置情况,直接键入set命令即可。

(4) shell的系统变量

常用系统变量:

$0 当前shell程序的名字

$1 ~ $9 命令行上的第一到第九个参数

$# 命令行上的参数个数

$* 命令行上的所有参数

$@ 分别用双引号引用命令行上的所有参数

$$ 当前进程的进程标识号(PID)

$? 上一条命令的退出状态

$! 最后一个后台进程的进程标识号

系统变量只能引用不能修改!

(5) shell的局部变量(用户变量)

▪ 局部变量是由用户根据需要任意创建的. 变量名通常由一个字母后跟零个到多个字母、数字或下划线组成。

▪ 引用变量的值时,在变量名前面加上$符号.

▪ 例如:

$ AA=123 定义变量AA

$ echo $AA 引用变量AA的值

123 (显示变量AA的值)

$ B=“this is a string” 定义变量B, (字符串中有空格时用引号)

$ echo $B 引用变量B的值

this is a string (变量B的值)

(6) 清除变量

当某个shell变量不再使用时,可以将其清除。当变量被清除后,它所代表的值也会一起消失。

清除变量使用 unset命令。

$ unset V

(7) 输出变量export

新的shell变量定义后或已有的shell变量修改值后, 如果未经export命令输出, 则只在当前的shell中起作用, 对其各个子shell不产生任何影响. 经过 export 命令输出的变量才能对当前shell的各个子shell、以及子shell的子shell起作用。

export 命令的功能就是输出变量,使在当前 shell 中新建的变量或重新赋值后的变量能够被后续可能新建的子 shell所识别。

例如:

$ PATH=$PATH:./

$ export PATH

7.7 shell的引用符

7.7.1 shell的引用符

▪ 使用引用符是防止字符串中某些特殊字符被shell解释成其他含义。

▪ 单引号、双引号、反撇号和花括号为shell的引用符。

▪ 特殊字符是指那些既可代表字符本身又可解释为其他意思的字符。

(1) 单引号和双引号

shell规定单引号禁止变量替换, 元字符$和*等保持其符号本身; 而双引号允许元字符变量替换.

$ a=“he is a student”

$ echo “She said: $a”

She said: he is a student echo执行时,替换了变量$a的值

$ b=‘The value of a is $a’

$ echo $b

The value of a is a e c h o 执行时,未替换变量 a echo执行时,未替换变量aecho执行时,未替换变量a的值

$ c=“The value of a is $a”

$ echo $c

The value of a is he is a student

(2) 反撇号

反撇号( ` )的作用就是把包括在反撇号中的字符串作为命令来执行,再把命令执行的结果(输出)加以利用。有时这也叫命令替换。

$ a=date

$ echo $a

date (变量a的值是字符串date)

$ b=date (反撇号中的字符串作为命令名)

$ echo $b

Sat Feb 1 16:28:19 Beijing 2003 (变量b的值是反撇号中命令的执行结果)

$ echo “Current directory is: pwd

Current directory is: /home/teachers/liudi

$

(3) 花括号

花括号({和})的功能就是把变量名与后面紧跟的其他字符区分开来。

$ c=“There is a teach”

$ echo “$cer reading room”

reading room (未定义变量cer, 其值用空串替代)

$ echo “${c}er reading room”

There is a teacher reading room

(花括号将变量名和后面的字符串区分开)

重点

(1)输入输出重定向和管道。(2)环境变量、系统变量和引用符。

输入输出重定向和文件的概念结合起来讲,它们分别是三个不同的特殊文件,将它们映射到其他文件或者对象上即可完成重定向,而管理对进程来说也是特殊的文件,通信端口对Linux来说本身就是文件。

环境变量等举例说明使用方式即可。

难点

输入输出重定向。

习题

1.简述shell的功能。

答:(1)命令解释器:解释用户发出的各种操作系统命令(2)程序设计语言:功能强大, 可包容引用所有的操作系统命令和可执行程序。

2.shell可以分为哪几类?

答:主要分为:(1)Bourne Shell (sh)(2)C shell (csh)(3)Korn shell (ksh)

拓展:Bourne Again shell(bash, sh 的扩展)、tcsh (csh 的扩展)和Public Domain Korn shell(pdksh, ksh 的扩展)。

3.管道的作用是什么?管道前后两条命令之间的关系是什么?

答:管道用于连接两个命令, 它把前一个命令的标准输出重定向给后一个命令作为标准输入。

  1. 如何设置一个变量?如何清除一个已有的变量?

答:创建变量:变量名通常由一个字母后跟零个到多个字母、数字或下划线组成。例如:

$ AA = 123

清除变量:当变量不再使用时,使用unset命令来清除变量。例如:

$ unset AA

原创声明

=======

作者: [ libin9iOak ]


本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任。

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。


目录
相关文章
|
2天前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
|
1月前
|
人工智能 Java 关系型数据库
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
81 4
Red Hat Enterprise Linux 9.5 发布下载,新增功能亮点概述
|
1月前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
33 0
Linux 如何更改默认 Shell
|
1月前
|
存储 运维 Linux
如何在 Linux 系统中使用 envsubst 命令替换环境变量?
`envsubst` 是 Linux 系统中用于替换文本中环境变量值的实用工具。本文分三部分介绍其工作原理、使用方法及实际应用,包括配置文件替换、脚本执行中环境变量替换和动态生成文件等场景,帮助用户高效利用 `envsubst` 进行开发和运维工作。
64 4
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
80 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
59 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
64 4
|
1月前
|
人工智能 安全 Linux
|
2月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。