第10章 sh编程
教材学习内容总结
本章主要讲了sh脚本的相关知识,包括sh脚本的介绍,sh脚本与C程序的对比,如何编写sh脚本以及如何调用sh函数
一、sh 脚本
sh 脚本是一个包含sh 语句的文本文件,命令解释程序sh要执行该语句。
1、创建一个mysh
#! /bin/bash
# comment line
echo hello
使用chmod +x mysh 使其可执行
2、命令行参数
在sh脚本中,可以通过位置参数$0、$1、$2等访问命令行参数。其中特殊字符$表示替换,如果需要使用$字符,需加上单引号或者反引号。
$#=命令行参数$1到$n的数量
$*=所有命令行参数,包括$0
$S=执行sh的进程PID
$?=最后一个命令执行的退出状态(成功为0,否则为非0)
二、sh命令
1、内置命令
.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,则等待所有活动子进程。
2、Linux命令
echo命令:将参数字符串作为行回显到stdout。
expr命令:间接更改sh变量的值。
管道命令:作为过滤器。
实用命令:
axk:数据处理程序。
cmp:比较两个文件。
comm:选择两个排序文件共有的行。
grep:匹配一系列文件的模式。
diff:找出两个文件的差异。
join:通过使用相同的键来连接记录以比较两个文件。
sed:流或行编辑命令。
sort:排序或合并文件。
tail:打印某个文件的最后口行。
tr:一对一宇符翻译。
uniq:从文件中删除连续重复行。
三、sh控制语句
sh支持多种控制语句,可类比C语言的语句。
1、if-else-if语句
C语言的if-else-if语句每个语句必须在单独的一行上,而sh允许多个语句在同一行上
语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
2、for语句
语法格式:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
命令行格式:
for var in item1 item2 ... itemN; do command1; command2… done;
3、while语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。
语法格式:
while condition
do
command
Done
4、untill-do语句
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。
语法格式:
until condition
do
command
done
5、case语句
case为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
语法格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
6、continue和break语句
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令不会跳出所有循环,仅仅跳出当前循环。
四、I/O重定向
>file:stdout转向文件,如果文件不存在,将会创建文件。
>>file:stdout追加到文件。
<file:将文件用作stdin;文件必须存在并具有r权限。
<<word:从“here”文件中获取输入,直到只包含“word”的行。
五、sh函数
1、sh函数的定义
func()
{
# function code
}
由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。而在sh函数中无法声明函数原型。
2、通配符
星号(*)通配符:可扩展到当前目录中的所有文件。
?通配符:查询某文件名中的字符。
[]通配符:查询文件名中一对[]中的字符。
3、调试脚本
sh脚本由带有-x选项的子sh运行以进行调试。
eg:bash -x mysh
子sh将在执行命令之前显示要执行的每个sh命令,包括变量和命令替换。它允许用户跟踪命令执行。如果出现错误,sh将在错误行上停止并显示错误消息。
六、实践
创建一个sh文件
运行sh文件
参考链接:https://www.runoob.com/w3cnote/shell-scripting.html
七、遇到的问题
1、openeuler系统安装增强功能
参考https://www.jianshu.com/p/e61352770864在openeuler系统(deepin)安装增强功能
由于版本不同,部分文件路径需自己调整
检查报错 /var/log/vboxadd-setup.log,但找不到具体解决办法