第十章读书笔记
第十章读书笔记
sh脚本
- sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句,所有的sh基本都执行相同的任务,脚本在语法上略有不同,shebang允许允许主sh调用适当版本的sh来执行脚本。如果未指定shebang,默认执行sh,即下列程序的第一行。
例:创建一个一个文本文件mysh,包含:
#! /bin/bash
//第一行通常以#!开始,通常称为shebang
# comment line
echo hello
- 使用chmod +x mysh使其可执行。然后运行mysh。
- 当主sh见到shebang时,读取脚本所针对的程序名并调用该程序。
sh脚本与C语言的区别
-
sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行,如果行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复制一个子进程来执行命令并等待子进程终止后再继续,这与它执行单个命令行完全一样。
sh脚本中每个变量都是字符串;
sh脚本不需要 main()函数。
-
C程序必须先编译链接到一个二进制可执行文件,然后通过sh子进程运行可执行的二进制文件。
C程序中变量必须有一个类型。
C语言必须有 main()函数。
命令行参数
- $#=命令行参数$1到$n的数量
- $*=所有命令行参数,包括$0
- $S执行sh的进程PID
- $?最后一个命令执行的退出状态
sh变量
- sh内置变量:PATH、HOME、TEAM......
- sh变量不用声明,未赋值的sh变量为NULL字符串
- sh变量赋值方法:
variable=string
sh中的引号
- sh有许多特殊字符,如$、/、*、>、<,用作普通字符时:使用 \ 或者单引号来引用他们。
单双引号的区别
- 双引号可以保留空格,且可以替换
- 单引号内没有替换
sh命令
Linux命令
- echo:将参数字符串作为行回显到stdout,通常将多个空格压缩为一个(除非有引号);
- expr:用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串;
- 管道命令:使用管道命令作为过滤器;
- 其它实用命令:
命令替换
- 当sh遇到'cmd'或$(cmd)时,会优先执行cmd,并用执行结果字符串替换$(cmd)。
sh控制语句
if-else-fi语句
- 默认情况下if-else-fi语句是比较两个参数字符串,以确定条件是否为真。需要注意,在sh中0为TURE,非0为DALSE;
for语句
- 变量每次迭代都接受一个参数字符串值,并执行do和done之间的命令;
while语句
- 当条件为真时,重复执行do-done语句,当条件为假时就退出执行;
until-do语句
- 当条件为真时就会退出循环;
case语句
- 在sh中比较少用
continue 和 break 语句
- continue重启最近循环的下一个迭代
- break退出循环
I/O重定向
进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件。I/O重定向有以下形式和含义:
- [>file stdout]转向文件,如果文件不存在,将会创建文件;
- [>>file stdout]追加到文件;
- [<file ]将文件用作stdin;文件必须存在具有r权限;
- [<<word ]从“here”文件中获取输入,直到包含“word”的行。
sh函数
- 定义为:
func()
{
# function code
}
- sh无法声明函数原型
sh中的通配符
- *通配符:可扩展到当前目录中的所有文件
- ?通配符:查询某文件名中的字符
- []通配符:查询文件名中一对[]中的字符
命令分组
- 可使用{}或()对命令进行分组,在相同环境下执行同一组的命令
eval语句
eval [arg1 arg1 ...argn]
- eval是sh的一个内置命令。由sh自己执行,不需要复制新进程。