sh编程
总结
shell编程就是对一堆Linux命令的逻辑化处理。
sh脚本
- sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句
- sh脚本由三个sh函数组成的层次结构组成;cpf2f()将文件复制到文件,cpf2d()将文件复制到目录,cpd2d()递归复制目录
- sh脚本的第一行通常以#!组合开始,通常称为shebang,当主sh见到shebang时,会读取脚本所针对的程序名并调用该程序。
- 如果没指定shebang,他将运行默认的sh。
sh脚本与c语言程序
- sh是脚本,是一个解释程序,而C语言却是能生成机器码的程序设计语言。
- sh脚本中的第一个可执行语句是程序的入口点。
- 如果行是可执行命令且为内置命令,那么sh可以直接执行。否则,他会复刻一个子进程来执行命令直到他终止。
- C程序需要先编译链接到一个二进制可执行文件,之后通过主sh子进程运行二进制可执行文件。
- C程序中的每一个变量必须有一个类型。
- C程序需要有一个mian()函数作为入口点。
命令行参数
- 可使用与运行sh命令完全相同的参数调用sh脚本
mysh one two three。
其中有:
$#为命令行参数从$1到$n的数量。
$*为所有命令参数。
$S为执行sh命令的PID。
$?为最后一个命令执行的退出状态。
sh变量
内置变量有PATH、HOME、TERM等,除此之外,用户还可使用任何符号作为sh变量,未赋值的sh变量是NULL字符串。
3sh符号
- 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中读取一行并为变量赋值;
shift:将位置参数$2 $3...重命名为$1 $2...;
trap[arg][n]:接收信号n后执行参数;
umask[ddd]:将掩码设置为八进制数ddd的;
wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。 - read 命令:
当 sh 执行 read 命令时,它会等待来自 stdin 的输入行。它将输人行划分为几个标记,分配给列出的变量。
linux命令
sh可以执行所有的linux命令
- echo命令:echo只是将参数字符串作为行回显到stdout;
- expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值;
- 管道命令:在sh脚本中经常使用管道作为过滤器;
- 实用命令:
awk:数据处理程序;
cmp:比较两个文件;
comm:选择两个排序文件共有的行;
grep:匹配一系列文件的模式;
diff:找出两个文件的差异;
join:通过使用相同的键来连接记录以比较两个文件;
sed:流或行编辑命令;
sort:排序或合并文件;
tail:打印某个文件的最后n行;
tr:一对一字符翻译;uniq:从文件中删除连续重复行。
sh控制语句
条件语句:
statements
elif [condition2]; then
statements
else
statements
fi
循环语句:
for语句:
do
commands
done
每次循环,for都接受其后面的一个变量值。
while语句:
do
commands
done
此外,还有continue/break语句,其用法和C语言类似,continue开始下一个迭代,break跳出循环。
I/O重定向
-
file stdout转向文件,如果文件不存在,将会创建文件
-
file stdout追加到文件
- <file 将文件用作stdin;文件必须存在具有r权限
- <<word 从“here”文件中获取输入,直到包含“word”的行
sh函数
sh的函数和C等高级语言的写法类似。函数必须在任何可执行语句之前定义,没有函数原型。
{
# function code
}
sh中的通配符
- file *:列出当前目录中所有文件的信息
- ls *.c:列出当前目录中所有以.c结尾的文件
- ?通配符:查询某文件名中的字符
- []通配符:查询文件名中一对[]中的字符
- file [ab]:包含字符a或b的所有文件名
- ls [xyz]:列出所有包含x、y或z的文件名
- ls [a-m]:列出包含a到m范围内字符的所有文件名
命令分组:
在sh脚本中,可以使用{}或()对命令进行分组
eval语句
eval是sh的一个内置命令,将输入参数字符串连接到一个字符串中,计算一次,然后给出结果字符串
调试sh脚本
sh脚本可由带有-x选项的子sh运行,以进行调试
学习感悟
通过学习本章我对sh编程的强大能力有了很深的感悟,虽然不是学的很深,但我还是感受到了他解放双手的能力
参考博文
[MyBlog](https://blog.csdn.net/m0_52316372/article/details/125724052?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166349136816800182177090%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166349136816800182177090&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-125724052-null-null.142v47pc_rank_34_default_3,201v3control_2&utm_term=markdown%E8%AF%AD%E6%B3%95&spm=1018.2226.3001.4187)
[MyBlog](https://blog.csdn.net/luanpeng825485697/article/details/80387819?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166349179916800192223568%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166349179916800192223568&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-80387819-null-null.142v47pc_rank_34_default_3,201v3control_2&utm_term=sh%E7%BC%96%E7%A8%8B&spm=1018.2226.3001.4187)