文章目录
- 题目一
- 题目描述
- 代码实现
- 关于$#的有关内容
- 实测
- 本程序的作用
- 题目二
- 题目描述
- 代码实现
- 注释
- 关于argc、argv
- 关于read函数
- 关于文件描述符
- 关于write函数
- 本程序的作用
- 题目三
- 题目描述
- 代码实现
- 实测
- 关于grep命令
- 关于read命令
- 题目四
- 题目描述
- 代码实现
- 关于test命令
- 实测
题目一
题目描述
请给下面的shell程序加注释,并说明程序的运行结果。
代码实现
#!/bin/bash
#bash script programming
if test $# == 0 # 参数个数为0(没有给出参数)
thenls -l|grep '^d' # 寻找并显示当前目录中以d开头的字符串,即目录文件
else # 参数个数不为0(给出了参数)for idols -l $i|grep '^d' # 寻找并显示给出的目录中以d开头的字符串,即目录文件done
fi
关于$#的有关内容
$# 表示命令行上参数的个数,但不包括shell脚本名本身
详情请参考:shell预先定义的特殊变量
实测
当给出参数 / 时
当给出参数 home 时
当给出参数 . 时(. 即为当前目录)
当不给出参数时
本程序的作用
我们会发现不给参数时执行结果与给出参数 . 时执行结果一致,也就是说本程序的作用是:
没有给出参数时,寻找并显示当前目录中以d开头的字符串,即目录文件
给出参数时,寻找并显示给出的目录中以d开头的字符串,即目录文件
题目二
题目描述
分析程序的功能以及运行结果,在代码后添加注释。
代码实现
注释
参数小于2输出“you forgot the enter a filename”
退出并报错
以只读方式打开参数1,其权限为0644,并将返回值赋值给fd1
创建一个文件在参数2,其权限为0644,并将返回值赋值给fd2
从fd1中读取字节数为512的内容到buf缓冲区,并将返回值赋值给n
将buf中字节数为n的内容写到fd2中,直到n不大于0
关闭fd1,fd2
关于argc、argv
argc表示参数数量,argv则是保存参数的数组,argv[0] 指向程序运行的全路径名,argv[1]是第一个参数,argv[2]是第二个参数,以此类推……
关于read函数
关于文件描述符
很多函数都会用到这个东西,这个东西其实就跟我们的学号一样,是为了方便引用某文件而存在的,其类型一般为int,比如一个文件叫test,碰巧还有一个文件叫test,于是我们在引用他们时如果“叫”他们的名字往往容易两个一起“回应”你,所以我们将他们分别描述为01、02,那么在需要引用他们的时候就方便多了。
关于write函数
本程序的作用
将fd1中的内容全部复制到fd2中
题目三
题目描述
编写一个shell脚本,检查给定的用户是否登陆系统。
代码实现
read -p "请输入用户名:" user
if who|grep -qw $user
thenecho $user login
elseecho $user not login
fi
实测
关于grep命令
本题中用到了grep命令的参数:-q,-w
grep -w :只匹配整个单词,而不是包含一部分单词的字符串
(如grep -w cmy 目标文件 ,只会匹配‘cmy’,而不匹配‘cmypangle’这种包含cmy的字符串)
grep -q : Quiet; do not write anything to standard output. Exit immediately with zero status if any match is found, even if an error was detected.
中文意思为,安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
不带-q是这样的:
不带-w是这样的
关于read命令
本题中用到了read命令的参数: -p
read -p :用于给出提示符,p是prompt的缩写,即由这个开关项给出提示信息。
例如,本题中,回车后屏幕会显示:
请输入用户名:
该语句之后输入的内容就会被保存到use变量中了
题目四
题目描述
编写一个shell脚本,判断文件是不是字符设备文件,如果是,将其拷贝到 /dev 目录下。
代码实现
if [[ -c $1 ]]
thencp $1 /dev
elseecho "This file is not a character device file!"
fi
关于test命令
为了方便就直接用老师的PPT截图了
至于cp命令……emm就是很常规的用法,这里就不说了~
实测
字符设备咱也不知道咋搞,就不搞复制的情况了~