20191223张俊怡-学习笔记3(第十章)
一、梗概
本章讨论了sh 编程,阐述了 sh 脚本和不同版本的sh ;比较了 sh 脚本与C程序,并指出了解释语言和编译语言的区别;详细说明了如何编写sh 脚本,包括 sh变量、sh 语句、sh内置命令、常规系统命令和命令替换;解释了sh 控制语句,其中包括测试条件、for 循环、 while 循环、do-until 循环、case 语句等,并示范了它们的用法;说明了如何编写sh函数以及使用参数调用sh函数;还举例说明了sh脚本的广泛应用,包括Linux 系统的安装、初始化和管理。
Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令,并把它送入内核去执行。内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止,而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存。Shell是一种应用程序,当用户登录Linux系统时,Shell就会被调入内存去执行。Shell独立于内核,它是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令。
二、知识点归纳
1、sh脚本
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
第一个sh脚本
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell)。
!/bin/bash
echo "Hello World !"
! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
2、sh变量
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="runoob.com"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
·命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
·中间不能有空格,可以使用下划线 _。
·不能使用标点符号。
·不能使用bash里的关键字(可用help命令查看保留关键字)。
有效的 Shell 变量名示例如下:
RUNOOB LD_LIBRARY_PATH _var var2
###使用变量:
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。
变量类型
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
3、sh的通配符
星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件。
- file :列出当前目录中所有文件的信息。
·ls .c:列出当前目录中所有以.c结尾的文件。
?通配符:查询某文件名中的字符
·file ???:有3个字符的所有文件名。
·ls ??:一个点号.后有2个字符的所有文件名。
[]通配符:查询文件名中一对[中的字符。
·file[ab]:包含字符a或b的所有文件名。
·ls[xyz]:列出所有包含x、y或z的文件名。
·ls[a-m]*:列出包含a到m范围内字符的所有文件名。 - 其他:
代表『 0 个或者无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a,b,c,d 这四个任何一个』
[-] 若有减号在中括号内时,代表『在编码顺序内癿所有字符』。例如 [0-9] 代表 0 刡 9 之间的所有数字,因为数字的语系编码是连续的!
[^] 若中括号内癿第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,叧要是非 a,c 的其他字符就接受的意思。
批注符号:这个最常被使用在 script 当中,规为说明!在后的数据均不执行。注释
\ 跳脱符号:将『特殊字符戒通配符』还原成一般字符
| 管线 (pipe):分割两个管线命令的界定
; 连续指令下达分割符:连续性命令的界定
三、最有收获的内容
本章我最有收获的内容是了解并掌握了初级的sh脚本的应用。
我初次接触到脚本是因为一款叫英雄联盟的游戏,在游戏里部分用户通过脚本程序自动控制英雄规避敌方技能,反应灵敏而且准确率很高,这让我对脚本程序产生了兴趣。
将平时使用的各种Linux命令按顺序保存(堆叠)到一个文本文件中,添加上执行权限,就是一个Shell脚本。
- ·将要执行的命令按先后顺序保存到一个文本文件
- 给该文件可执行权限,便可运行
- 可结合各种Shell控制语句以完成更复杂的操作
将Linux运维重复性的工作,全部通过脚本来完成,提升工作效率的同时,还不会出错。
四、问题与解决思路
1、大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如何呈现出来的?
- 答:在我看来,学习一门程序设计语言需要的要素和技能有:创新、细心、简化问题、多动手、多理解(不要死记硬背)。因为我们在编程时,同一段代码在不同的环境里会有不同的作用,我们应理解代码的用法与环境相匹配,根据需求选择合适的方法,死记硬背是很低效的。还有就是多动手才能发现自身的问题,一个程序在你脑海里与现实中的差距是很大的,不要做思想上的巨人,行动上的矮子。还有就是我们在学一门程序语言时要有简化问题的能力,书上给的代码很容易理解,但不一定是最有效率、最简洁的。我们在编程时要学会把复杂问题简单化,这就需要我们在原有基础上能创新,用于探索更简单的方法,不能认为可以运行就完事了,还应注重程序的长度、效率等方面。在shell脚本中,这些要素都能体现,比如简化问题的能力,shell的应用场景很多都是做一些重复性的工作,sh脚本让程序更加自动化,简洁而且准确率高,这就减少了人力消耗,省时省力。
2、如何屏蔽命令的输出结果?
- linux 默认会创建一个设备文件/dev/null(空设备),所有输出到该设备的信息都会被屏蔽。通过把命令的输出重定向到设备/dev/null,可以屏蔽命令的输出结果。
命令 > /dev/null
屏蔽命令的错误输出
命令 2> /dev/null
屏蔽命令的正常以及错误输出
命令 > /dev/null 2> /dev/null
例如:要在 shell 代码中使用 grep 命令查找文件是否存在某个关键字,但是又希望屏幕 grep 命令的输出。
if grep jack /etc/passwd > /dev/null
then
echo "jack found"
fi
如果 /etc/passwd 文件中有 jack 关键字的信息,将会显示 jack found,但不会输出 grep 命令的执行结果。
3、 如何把一条命令分成多行编写
- linux 的 shell 脚本功能非常强大,它允许用户通过管道方式把多个命令组合在一起,但因此往往也导致在一行 shell 脚本代码中编写的命令过长,难以阅读,为了使脚本的结构更加清晰,可以把一行 shell 脚本代码分成多行进行编写。
使用两个管道符把ps、grep 和 awk 命令组合。
[root@localhost ~]# ps -ef | grep sshd | awk '{print $2}'
4478
12821
22028
在一行代码中把多个命令组合在一起,难以阅读。shell 提供了一个特殊字符“\”,可以把一行代码分成多行进行编写。
五、实践内容
- 使用sh编写9*9乘法表
如图所示: