第10章 sh编程——教材知识点归纳
摘要:本章介绍了sh脚本;比较sh脚本与c程序;详细说明了如何编写sh脚本,解释了sh控制语句;说明了如何编写sh函数以及使用参数调用sh函数;最后举例说明了sh脚本的广泛应用。
10.1sh脚本与c程序
Sh是一个解释程序,逐行读取sh脚本文件并直接执行这些行。若行是可执行命令且位内置命令,则sh可直接执行。否则,会复制一个子进程来执行。C程序必须先编译链接到二进制,后通过主sh子进程运行。Sh脚本每个变量都是字符串,且不需要main函数。Sh脚本中,第一个可执行语句是程序的入口点。
10.2命令行参数
前十个,$0$9,之后的用$(10)$(n),n>10
$#=命令行参数$1到$n的数量
$*=所有命令行参数,包括$0
$S=执行sh的进程pid
$?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
10.3 sh变量
sh有许多内置变量,如PATH、HOME、Term等。除了内置变量外,用户还可以使用任何符号作为sh变量。不需要声明。所有的sh变量值都是字符串。未赋值的sh变量是NULL字符串。sh变量可用以下方法设置或赋值:
variable=string # NOTE: on white spaces allowed between tokens
10.5 sh中的引号
sh有许多特殊字符,如$、/、*、>、<等。要想把它们用作普通字符,可使用\或单引号来引用它们。
10.6 sh语句
sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。
10.7 sh命令
sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。下面列出一些常用的内置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,则等待所有活动子进程。
10.8 sh控制语句
10.8.1 if-else-fi 语句
重要:sh中,0为真,非0为假
For语句
While语句
Until-do语句
Case语句
10.13~10.15 sh中的通配符、命令分组、eval语句
sh中的通配符:
*是通配符,可以配位所有字符。
?可以配对对应数量的字符。
[xyz]配对中括号内的字符。
sh命令分组
类似于C语言,sh脚本可用{}和()进行命令分组。{}中语句在相同的环境下执行,()在subsh进程中执行,不影响sh的工作目录。
eval语句
eval是sh一个内置命令,对其后的参数进行一次计算。
如a="cat file.txt"时,直接写$a会出错,而eval $a就可以执行a。
实践部分
使用sh命令实现猜数字的功能:
代码如下:
!/bin/bash
脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
猜小了或猜大了,直至用户猜对脚本结束。
RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
使用取余算法将随机数变为 1‐100 的随机数
num=$[RANDOM%100+1]
echo "$num"
使用 read 提示用户猜数字
使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
‐lt(小于),‐le(小于等于)
while :
do
read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
if [ $cai -eq $num ]
then
echo "恭喜,猜对了"
exit
elif [ $cai -gt $num ]
then
echo "Oops,猜大了"
else
echo "Oops,猜小了"
fi
done
用shell脚本输入一个小于100的整数,并计算从1到该数之间所有整数的和
代码截图:
运行截图: