基础的shell编程问题(一)


题目一

题目描述

请给下面的shell程序加注释,并说明程序的运行结果。


代码实现

#!/bin/bash
#bash script programming
if test $# == 0 # 参数个数为0(没有给出参数)
then
        ls -l|grep '^d'   # 寻找并显示当前目录中以d开头的字符串,即目录文件
else  # 参数个数不为0(给出了参数)
        for i
        do
                ls -l $i|grep '^d'  # 寻找并显示给出的目录中以d开头的字符串,即目录文件
        done
fi

关于$#的有关内容

$# 表示命令行上参数的个数,但不包括shell脚本名本身
详情请参考:shell预先定义的特殊变量


实测

当给出参数 / 时
在这里插入图片描述
当给出参数 home 时
在这里插入图片描述
当给出参数 . 时(. 即为当前目录)
在这里插入图片描述
当不给出参数时
在这里插入图片描述


本程序的作用

我们会发现不给参数时执行结果与给出参数 . 时执行结果一致,也就是说本程序的作用是:

没有给出参数时,寻找并显示当前目录中以d开头的字符串,即目录文件
给出参数时,寻找并显示给出的目录中以d开头的字符串,即目录文件


题目二

题目描述

分析程序的功能以及运行结果,在代码后添加注释。


代码实现

在这里插入图片描述


注释

参数小于2输出“you forgot the enter a filename”

退出并报错

以只读方式打开参数1,其权限为0644,并将返回值赋值给fd1

扫描二维码关注公众号,回复: 12398840 查看本文章

创建一个文件在参数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
then
        echo $user login
else
        echo $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 ]]
then
        cp $1 /dev
else
        echo "This file is not a character device file!"
fi

关于test命令

为了方便就直接用老师的PPT截图了

在这里插入图片描述
在这里插入图片描述
至于cp命令……emm就是很常规的用法,这里就不说了~


实测

在这里插入图片描述
字符设备咱也不知道咋搞,就不搞复制的情况了~

猜你喜欢

转载自blog.csdn.net/Jormungand_V/article/details/109583313
今日推荐