第十章读书笔记
知识点归纳
1.sh脚本
sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。在我的理解来看,之前学习了makefile语句,貌似就是sh脚本的高配语句。
sh是一个解释程序,逐行读取sh脚本文件并执行。
2.命令行参数
位置参数
$n(if n > 9, add {})
$0是程序名本身,其余是程序的参数。
内置变量
$#=命令行参数的数量(1-n)
$*=所有命令行参数,包括$0
$S=执行sh的进程PID
$?=最后一个命令执行的退出状态(if success, set 0)
在sh中,特殊字符$表示替换,还有其他许多特殊字符如/、*、>、<等。如果想把他们用作普通字符,可使用或单引号来引用它们。
通常,用于引用单个字符,单引号中用于引用长字符串,在双引号中会发生替换。
3.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,则等待所有活动子进程。
Linux命令
sh可以执行所有的Linux命令。
echo: 打印参数字符串。
expr: 将参数字符串转换为数字,对数字执行操作,在将数字转换为字符串。
awk: 数据处理程序。
cmp: 比较两个文件。
comm: 选择两个排序文件共有的行。
grep: 匹配一系列文件的模式。
diff: 找出两个文件的差异。
join: 通过使用相同的键来链接记录以比较两个文件。
sed: 流或行编辑命令。
sort: 排序或合并文件。
tail: 打印某个文件最后n行。
tr: 一对一字符翻译。
uniq: 从文件中删除连续重复行。
命令替换
在sh中,$A会被替换成A值。当sh遇到'cmd'或者(cmd)时,他会先执行cmd,然后用执行的结果字符串替换。
4.sh控制语句
sh是一种编程语句,其使用方法与C相似。
for语句
运算符-eq、-ne、-lt、-gt等将参数作为整数进行比较。
-e name
-f name
-d name 判断是否为文件夹
-r name 判断文件是否可读
name -ef name 判断文件是否相同
while语句
until-do语句
case语句
continue&break语句
5.I/O重定向
当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout、和sterr以外的文件。
>file stdout转向文件,如果文件不存在,将会创建文件。
>>file stdout追加到文件。
<file 将文件用作stdin;文件必须存在并具有r权限。
<<word 从“here”温江中获取输入,直到只包含word的行。
6.sh函数
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。
7.sh通配符
*: 拓展到当前目录中的所有文件
?: 查询某文件名中的字符。
[]: 查询文件名中一对[]中的字符。
问题与解决思路
实践内容
编程项目:用sh脚本递归复制文件
项目sh代码如下:
#! /bin/bash
read -p "filename
" file
checkfile()
{
if [ -f $1 ]; then
return 0
elif [ -d $1 ]; then
return 1
else
return 3
fi
}
checkfile $file
if [ $? -eq 0 ]; then
echo $file is a REG file
elif [ $? -eq 1 ]; then
echo $file is a DIR file
else
echo unknow file type
fi
项目运行截图如下: