学习笔记3(20191203张金傲)
自学教材第10章,提交学习笔记
sh编程
sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。
- 创建一个文本文件mysh :
` #!/bin/bash
comment line
echo hello`
使用chmod+x mysh使其可执行
sh脚本的第一行通常以#!组合开始,通常称为shebang。当主sh遇见shebang时,会读取脚本所针对的程序名并调用该程序。
sh脚本与C程序
sh脚本:
- sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则它会复刻一个子进程来执行命令,并等待子进程终止后再继续。
- sh脚本中,每个变量都是字符串,因此不需要类型,因为只有字符串。
- sh脚本不需要main函数,在sh脚本中,第一个可执行的语句是程序的入口点。
C程序:
- c程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。
- 在C程序中,每个变量必须有一个类型,例如char、int、等。
- C程序必须有一个main函数,每个函数必须定义一个返回值类型和参数。
命令行参数
-
可使用与运行sh命令完全相同的参数调用sh脚本,如:
sh one two thre
在sh脚本中,可以通过位置参数$、$1、S2等访问命令行参数。前10个命令行参数可以作为$0~$9被访问。其他参数必须称为$10}-S{n},其中n>10。或者,可以通过稍后显示的 shift f命令查看它们。通常,O是程序名本身,S1到n是程序的参数。在sh中,可用内置变量 $ #和$*计数并显示命令行参数。 -
$#=命令行参数$1到Sn的数量
*=所有命令行参数,包括$O
此外,sh还有与命令执行相关的以下内置变量。
SS=执行sh的进程PID
S?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
sh变量
- sh有许多内置变量,如PATH、HOME、TERM等。除了内置变量外,用户还可使用任何符号作为sh变量。不需要声明。所有的sh变量值都是字符串。未赋值的sh变量是NULL字符串。
sh中的引号
- sh中的特殊字符,如$、/、*、>、<等,要想把它们用作普通字符,可使用\或单引号来引用它们
sh语句
- sh语句包括所有的Unix/Linux命令,以及可能的I/O重定向。
- 此外,sh编程语言还支持控制sh程序执行的测试条件、循环、case等语句。
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的输入行。 - linux命令
echo命令:echo只是将参数字符串作为行回显到stdout,通常将相邻的多个空格压缩为一个空格,除非有引号。 expr命令:将两个参数字符串转换为数字,然后对数字执行操作OP,再将得到的数字转换回字符串
expr string1 op string2
管道命令:在sh中经常使用管道作为过滤器
ps -ax | grep httpd
cat file | grep word
其他实用命令:
axk:数据处理程序。
cmp:比较两个文件。
comm:选择两个排序文件共有的行。
grep:匹配一系列文件的模式。
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件。
sed:流或行编辑命令。
sort:排序或合并文件。
tail:打印某个文件的最后n行。
tr:一对一宇符翻译。
uniq:从文件中删除连续重复行。
命令替换
- 在sh中,$A会被替换成A值。同样,当sh遇到'cmd'或$(cmd)时,它会先执行cmd,然后用执行的结果字符串替换成$(cmd)。
echo $(date)
echo $(ls dir)
sh控制语句
sh是一种编程语言,支持许多执行控制语句,类似于c语言中的语句。
- if-else-fi语句
if [condition] then statemates else statements fi
- for语句
for VARIABLE in string1 string2 ... stringn do commands done
- whlie语句
while [condition] do commands done
- until-do语句
until [$ANS = "give up"] do echo -n "enter your answer" read ANS done
- case语句
case $variable in pattern1) commands;; pattern2) commands;; patternn) commands;; esac
- continue和break语句
与C语言一样,continue重启最近循环的下一个迭代,break退出最近循环,工作原理相同
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函数定义 func() { # function code }
sh中的通配符
*:可扩展到当前目录中的所有文件
?:查询某文件名中的字符
[]:查询文件名中一对[]中的字符
命令分组
- 在sh脚本中,可以用{}或()对命令进行分组
eval语句
- eval是sh的一个内置命令。它由sh自己执行,而不需要复刻新进程。它将输入参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,然后给出结果字符串供sh执行。
调试sh脚本
- sh脚本可由带有-x选项的子sh运行,以进行调试
bash -x mysh
sh脚本的应用
编程项目:用sh脚本递归复制文件
大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?
- 程序设计语言是用于书写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中,这些记号串就是程序。程序设计语言有3个方面的因素,即语法、语义和语用。语法表示程序的结构或形式,亦即表示构成语言的各个记号之间的组合规律,但不涉及这些记号的特定含义,也不涉及使用者。语义表示程序的含义,亦即表示按照各种方法所表示的各个记号的特定含义,但不涉及使用者。
- shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。shell脚本中最重要的就是对shell命令的使用与组合,再使用shell脚本支持的一些语言特性,完成想要的功能。
- shell的基本语法在本章书中的内容已有详解,但是还不够全面,shell脚本的语法主要涉及到变量、运算符、执行相关、输出、流程控制、定义函数、输入输出重定向、读取外部输入、文件引用、颜色标识、程序换行、shell操作mysql、退出脚本等。
- shell语法定义以开头:
#!/bin/bash
#!用来声明脚本由什么shell解释,否则使用默认shell。单个"#"号代表注释当前行。第一步:编写脚本文件。第二步:加上可执行权限。第三步:运行