《信息安全系统设计与实现》学习笔记3
第十章 sh编程
sh脚本
- sh脚本是一个包含sh语句的文本文件,命令行解释程序sh要执行该语句。
创建文件文本mysh,包含:
#!/bin/bash
# comment line
echo hello
sh脚本与C程序
- sh脚本和C程序有一些相似之处,但他们在根本上是不同的。
-
sh是解释程序,逐行读取sh脚本并直接执行这些行,而C语言必须先编译链接到一个二进制可执行文件。
-
在sh脚本中,每个变量都是字符串,而C语言的变量都必须有一个类型如char、int、float等
-
sh脚本不需要main函数,而C语言必须有main函数。
-
命令行参数
可使用与运行sh命令完全相同的参数调用sh脚本,如:mysh one two three
sh中内置变量:
$# = 命令行参数$1到$n的数量
$* = 所有命令行参数,包括$0内置变量
$S = 执行sh的进程PID
$? = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
sh变量
- sh有许多内置变量,如PATH、HOME、TERM等。
sh中的引号
- sh中的特殊字符,如$、/、*、>、<等,要想把它们用作普通字符,可使用\或单引号来引用它们。
sh语句
- sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。
sh命令
-
内置命令
.file
break [n]
cd [dirname]
continue [n]
eval [arg...]
exec [arg...]
exit [n]
export [var…]
trap [arg] [n]
umask [ddd]
wait pid]
read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为几个标记,分配给列出的变量。
Linux命令
-
echo命令:echo只是将参数字符串作为行回显到stdout,它通常将相邻的多个空格压缩为一个空格,除非有引号
-
expr命令:因为所有的sh变量都是字符串,所以我们不能直接把它们改为数值,可通过expr命令间接更改sh变量的值,运行方式如下:
expr string1 OP string2
-
管道命令:在sh脚本中经常使用管道作为过滤器
ps -ax | grep httpd
cat file | grep word
-
实用命令
-
axk:数据处理程序
-
cmp:比较两个文件
-
comm:选择两个排序文件共有的行
-
grep:匹配一系列文件的模式
-
diff:找出两个文件的差异
-
join:通过使用相同的键来连接记录以比较两个文件
-
sed:流或行编辑命令
-
sort:排序或合并文件
-
tail:打印某个文件的最后口行
-
tr:一对一宇符翻译
-
uniq:从文件中删除连续重复行
-
命令替换
- 在sh中,$A会被替换成A值/同样,当sh遇到'cmd'或$(cmd)时,它会先执行cmd,然后用执行的结果字符替换$(cmd)
sh控制语句
-
if-else-fi语句
-
if-else-fi语句的语法是:
if [condition] then statemates else statements fi
-
-
if-elif-else-fi语句
-
这类似于C语言中的if-else- if-else
if [condition];then commands elif [condition2];then commands else commands fi
-
-
for语句
-
sh中的for语句作用类似于C语言中的for循环
for VARIABLE in string1 string2 ... stringn do commands done
-
-
while语句
-
类似于C语言中的while循环
while [condition] do commands done
-
-
until-do语句
-
类似于C语言中的do-until语句
until [ $ANS = "give up" ] do echo -n "enter your answer" read ANS done
-
-
case 语句
-
类似于C语言中的case语句
case $variable in pattern1) commands;; pattern2) commands;; patternn) commands;; esac
-
I/O重定向
-
当进入sh命令时,我们可以指示sh将I/O重定向到除默认stdin、stdout和sterr以外的文件
> file:stdout转向文件,如果文件不存在,将会创建文件 >> file:stdout追加到文件 < file:将文件用作stdin;文件必须存在并且具有r权限 << word:从“here”文件中获取输入,直到只包含“word”的行
嵌入文档
- 可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字
sh函数
- sh函数的调用方式与sh脚本文件的执行方式完全相同。sh语句
func s1 s2 ... sn
调用sh函数,以参数(字符串)形式传递s1~sn
sh中的通配符
-
星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件
-
file *:列出当前目录中所有文件的信息
-
ls *.c:列出当前目录中所有以.c结尾的文件
-
-
?通配符:查询某文件名中的字符
-
file ???:有3个字符的所有文件名
-
ls *.??:一个点号.后有两个字符的所有文件名
-
-
[ ]通配符:查询文件名中一对[]中的字符
-
file [ab]:包含字符a或b的所有文件名
-
ls [xyz]:列出所有包含x、y或z的文件名
-
ls [a-m]:列出包含a到m范围内字符的所有文件名
-
命令分组
- 在sh脚本中,可以使用{}或()对命令进行分组
eval语句
eval [arg1 arg2 ... argn]
- eval是sh的一个内置命令。它由sh自己执行,而不需要复刻新进程。
实践:用sh脚本递归复制文件
过程
文件myrcp.sh代码
苏格拉底挑战
遇到的问题
问题:在实践“用sh脚本递归复制文件”中,执行myrcp.sh文件报错
解决办法:问gpt
看完gpt的回答,我修改了一下代码,最后运行成功
--------------------------------------------------------------------------------------------------------------------------