实验四 Shell编程

一、实验目的
1、掌握shell环境变量、管道、输入输出重定向使用方法;
2、掌握shell脚本建立和执行方法;
3、掌握shell脚本的基本结构;
4、掌握基本的shell编程方法。

二、实验环境:
一台运行GNOME图形用户界面的任意一种Linux操作系统的计算机。

三、实验内容与步骤
PART 1 shell程序理解
1.建立一个shell脚本文件,内容为:
for username in test{1…10}
do
useradd u s e r n a m e e c h o " username echo " usernameecho"{username}abc" | passwd --stdin $username &> /dev/null
done
cat /etc/passwd | grep test
观察并分析程序运行结果。
程序分析:循环为变量username赋值为test1-test10,并利用这个变量建立一个以这个变量为用户名的账户,成功或者失败都将提示或者错误流丢弃到/dev/null(丢弃)。最后打开/etc/passwd文件,筛选带有test字符的信息。

运行结果:

在这里插入图片描述
在这里插入图片描述

2. 建立一个shell脚本文件,内容为:
if test “$USER” = “root”
then
yum -y install httpd
else
echo “您不是管理员,没有权限安装软件。”
fi
观察并分析程序运行结果。
程序分析:
去除USER环境变量判断是否为root,如果是则使用yum命令安装httpd反正在显示屏上显示提醒:您不是管理员,没有权限安装软件。

运行结果:
在这里插入图片描述
在这里插入图片描述

3.运行教材184页例7.13程序。
运行截图:
在这里插入图片描述
在这里插入图片描述

(这里由于我这个目录下有很多个.c程序,所以就这样,这个程序将当前目录下所有的.c文件用循环依次输出,由于太长,只截了一部分)*

4.运行教材184页例7.14程序。
在这里插入图片描述
在这里插入图片描述

不知道为什么没有运行成功

PART 2 shell程序设计
1.编程实现如下功能:输入一个账号信息,如系统中无此账号,则输出提示“该账号不存在”,否则输出提示“是否删除该账号Y|N”,如输入y或Y,则删除该账号,输入N或n则不删除,输入其他字符,则重复出现提示“是否删除该账号Y|N”。
答:

```c
echo "输入一个账号名"
read account
#进行判断,如果在passwd目录下存在这个账号名则证明存在
if [ `cat /etc/passwd | grep -w $account` ]
	then echo "是否删除该账号Y|N"
	read determind			#读取决定
	if [ "$determind" = "Y" -o "$determind" = "y" ]	#进行删除
		then `userdel -r $account`	#连带目录和邮箱一起删除
	#如果输入的不是n或者y则重新进行输入和判断
	else 	#并重复提示是否删除Y|N
		while [ "$determind" != "N" -a "$determind" != "n" ]
		do
			echo "是否删除该账号Y|N"
			read determind
			if [ "$determind" = "Y" -o "$determind" = "y" ]
				then ` userdel - r $account`
				break;
			fi
		done
	fi
	
else
	echo "该账号不存在";
fi

运行截图:
在这里插入图片描述
在这里插入图片描述
2.编程实现如下功能:在用户家目录下建立10个目录,目录名称为xyz1,xyz2……xyz10,并设置每个目录的权限,其中文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读,执行;其他用户的权限为:读,执行。
答:

#进入用户家目录
if [ "$USER" = "root" ]	#判断此时用户是否是root
	then cd /root		#root家目录
	else cd /home/$USER	#普通用户家目录
fi
for filename in xyz{1..10}
do
	mkdir $filename 
	chmod 755 $filename
done

运行截图:
在这里插入图片描述
在这里插入图片描述

3.建立一个文本文件,名为:user.txt,文件格式如下所示,每行的第一个字符串对应用户名,第二个字符串对应为初始密码,一共10行数据。
aaa abc123456
bbb cdef90800
ccc 123abclin
……
编程实现如下功能:建立10个账号信息,其中用户名和初始密码从文件user.txt中读取。为简化操作,假设系统中不存在重名账号。
答:代码为:

#!/bin/bash
cat user.txt | while read userAndPasswd
do
	user="`echo $userAndPasswd |cut -d " " -f 1`"
	passwd="`echo $userAndPasswd | cut -d " " -f 2`"
	#echo -e "$user"  " \c"
	#echo "$passwd"
	useradd $user
	echo "$passwd" | passwd --stdin $user
done

4.编程实现如下功能:输入一个用户名,查找是否已登录系统,如已登录,则发送一个消息给他,消息内容为:“ hello,用户账号”;如未登录,则显示“用户尚未登录”。
答:

read username
if [ -n `who | grep -m 1 -o $username` ]	#the user logined
then 	
	ttyStr=`who | grep $username | grep -m 1 pts | cut -d "/" -f 2`
	tty=pts/${ttyStr:0:1}
	 echo "hello,$username" | write $username $tty
else
	echo "用户尚未登录"
fi 

运行截图:
在这里插入图片描述

5.教材189页习题第6题。
答:

if [ ! \( -d temp \) ]
then 
	mkdir temp
fi
for filename in `ls *.c`
do	

	cp $filename temp 	#指定目录为当前目录下的/temp目录
done
ls temp/ -Sl 	#从大到小排序输出,如果再加上r就是从小到大排序输出

6.教材189页习题第7题。
答:

filename=$1
while [ -n "$2" ] 
do
	cat $2 >> $filename
	shift
done	
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的 Linux操作系统shell是用户与系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令界面。用户在shell提示符($或#)下输入的每一个命令都由shell先解释,然后传给内核执行。本实验要求用C语言编写一个简单的shell程序,希望达到以下目的:  用C语言编写清晰易读、设计优良的程序,并附有详细的文档。  熟悉使用Linux下的软件开发工具,例如gcc、gdb和make。  在编写系统应用程序时熟练使用man帮助手册。  学习使用POSIX/UNIX系统调用、对进程进行管理和完成进程之间的通信,例如使用信号和管道进行进程间通信。  理解并发程序中的同步问题。  锻炼在团队成员之间的交流与合作能力。 2. 实验要求 1. ysh解释程序的重要特征 本实验实现一个简单的命令解释器,也就是Linux中的shell程序。实验程序起名为ysh,要求其设计类似于目前流行的shell解释程序,如bash、csh、tcsh,但不需要具备那么复杂的功能。ysh程序应当具有如下一些重要的特征:  能够执行外部程序命令,命令可以带参数。 . 。  能够执行fg、bg、cd、history、exit等内部命令。  使用管道和输入输出重定向。  支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前运行作业的前台/后台状态,以及控制作业的挂起、中止和继续运行。 除此之外,在这个实验中还须做到:  使用make工具建立工程。  使用调试器gdb来调试程序。  提供清晰、详细的设计文档和解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值