sh与C
sh是逐行解释的,不用main()函数,切入点为第一行,没有变量类型(或者说只有字符串),sh读取命令方式为读取若为内置命令则执行,否则复刻一个子进程执行
sh脚本可以通过$0-$9访问命令行参数。一般$0为程序本身,$1-$n为程序的参数
部分的内置变量
$#=$1-$n的数量
$*=所有参数,包括本身
$S=执行sh程序的PID
$?=最后一个命令的退出状态(成功为0否则不为0)
变量赋值可以直接
变量=值
不用申明类型,如果A是一个变量,$A就是A的值
sh中的引号为\或‘’相当于C语言的双引号,一般\单个字符,‘长字符串’,“$变量”(双引号会将其替换为$变量的值)
sh有所有的linlux命令,还有许多内置命令如图:

read命令用以用户和sh进行交互,类似于C的scanf
sh遇到‘cmd’或者$(cmd)会先执行cmd,然后用执行结果替换$(cmd)
if-else-fi语句:
if[条件];then
动作
else
动作
fi
复合条件与C相同,用&&与||,可以用()分组
可以通过=,!=,<,>比较字符串
sh中0为TRUE,非0为FALSE
-eq,-e name之类的文件也可以作为整数比较或者测试文件属性
for语句:
for 变量 in 值1 值2 ... 值n
do
动作
done
white语句:
while[条件]
do
动作
done
条件为真的时候执行动作
do-until语句
until[条件]
do
动作
done
类似于C的do-until
case语句:
case $变量 in
值1) 动作;;
值2) 动作;;
esac

continue和break与C语言相同
'>file stdout转向文件,弱不存在则创建'
'>>file stdout追加到文件'
'<file 将文件作为stdin;文件必须具有r权限'
'<<word 从“here”文件读取输入,直到只包含“word”的行'
sh的函数
函数名()
{
函数内容
}
sh无法申明函数原型,所以调用方式和脚本文件执行方式相同
func s1 ... sn以参数形式传递s1~sn
通配符:*具体使用参考示例

一个语言需要学习其语法的各个细节,各种禁忌,还有其用处
在sh中,介绍了语法,然后最后给出了使用的实例(用于解决冗长的代码)然后是禁忌,比如提到的<file需要r权限,不能申明类型所以需要用特殊的方式比较等等