Unix/Linux系统编程第10章学习笔记
作者:20191322wyl
知识点总结与最有收获的内容
sh脚本
- sh脚本使用chmod +x 文件名执行。(chmod可以赋予文件权限)
- sh脚本中的行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复制一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样
- sh中变量只有一个类型,就是字符串
- sh不需要main函数,第一个可执行语句就是程序入口
命令行参数
- 前十个,$0$9,之后的用$(10)$(n),n>10
- $#=命令行参数$1到$n的数量
- $*=所有命令行参数,包括$0
- $S=执行sh的进程pid
- $?=最后一个命令执行的退出状态(如果成功,则为0,否则为非0)
sh变量
- sh变量不用声明,未赋值的sh变量为NULL字符串
- 如果A是一个变量,则$A是变量A的值(未赋值情况下为NULL)
- 使用“=”给变量赋值
sh中的引号
与转义字符“\”一样,加上后就没了特殊含义,就是一个普通字符串
sh语句
sh命令
内置命令
sh的内置命令由sh执行,不需要创建一个新的进程
read命令:read命令可以获取输入的字符串
Linux命令
sh可以执行所有的linux命令
-
echo命令:打印字符串,没有引号的情况下不管多少个空格都会压缩为一个空格
-
expr命令:
一般的代码
i=“i”+1
是将i的值变成了“i+1”expr string1 OP string2
,将string1和string2转换为数字再进行op操作,最后再转换为字符串例:
expr $i + 1
就实现了上面的操作 -
管道命令
使用管道命令作为过滤器
-
实用命令:
命令替换
当sh遇到“命令”或$(命令)时,会先执行命令,然后将执行结果字符串替换到$(命令)
sh控制语句
与C语言类似
if-else-fi语句(注意是fi)
每个语句必须在同一行上,但是如果多个语句之间用“;”隔开,则允许在同一行。
sh中,0为真,非0为假
if-elif-else-fi:与C语言中用法类似
for语句
while语句
until-do语句
类似于C语言中的do-until语句
case语句
在sh中很少使用
sh函数
sh函数的定义为
func()
{
#function code
}
执行语句:func s1 s2 s3....sn
sh中的通配符
- 星号通配符*:扩展到当前目录下的所有文件
- ?通配符?:查询某文件名中的字符
- []通配符:查询文件名中一对[]中的字符
命令分组
可使用{}或()对命令进行分组,在相同环境下执行同一组的命令
eval语句
eval [arg1 arg2....]
eval会先扫描需要执行的命令,将其中可替换的内容替换掉,再执行命令
问题
1
eval会替换命令的值,那如果我用eval运行cat file(某一个文件会怎么样)?
解答:
当我们把cat file直接赋予myfile变量后,我们直接echo myfile的内容将不会输出我们在file文件里面的文本。然后当我们用eval命令后,就会输出我们想要的内容。这时因为eval命令不但可以置换该变量,还能执行相应的命令。在第一次扫描中进行了变量置换,第二次扫描就执行了该变量所包含的字符串里面的cat file 命令,所以就输出了我们想要的内容。
总结程序设计语言有哪些必备的要素和技能
以下内容仅供参考
- 需要有基本的内置函数来实现于键盘以及屏幕的交互,就像printf与scanf一样
- 需要有基本的数据类型定义
- 需要有基本的程序结构语句,比如顺序结构、分支结构、条件结构等
- 需要有可以让用户自定义函数的语句
- 可以在命令行进行交互
- 暂时只想到这些