shell编程(1)

一.回顾练习

一般通配符

 

花括号{}

 

倒引号,单引号,双引号

 

输出重定向> >>

  

输入重定向< <<

 

用户自定义变量

 

 

二 Shell命令练习

(1)通过帮助信息查看,简述以下文件的用途

①/etc/passwd (提示:通过man 5 passwd查看此文件描述说明)

   /etc/passwd存放密码文件,文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性,包括:登录名,可选的加密后的密码,数字用户id,数字组id,用户名和注释字段,用户主目录,可选的用户命令解释器。

 

②/etc/shadow(提示:通过man 5 shadow查看此文件描述说明)

    /etc/shadow是passwd文件的一个影子,/etc/shadow文件中的记录行与/etc/passwd中的一一对应,但是只有系统管理员才能够进行修改和查看。

 

③/etc/group(提示:通过man 5 group查看此文件描述说明)

    /etc/group存储有关本地用户组的信息

 

④/etc/gshadow(提示:通过man 5 gshadow查看此文件描述说明)

   /etc/gshadow是/etc/group的加密资讯文件,比如用户组管理密码就存放在该文件中。

 

 

(2)依次输入如下命令,观察运行结果。结合man id查看到的帮助信息,指出每一条命令功能

 

 

    id:id命令可以显示真实有效的用户ID(UID)和组ID(GID)

    id -u只显示用户ID

    id -u root 即查看root的用户ID,为0

    id -u hadoop即查看用户hadoop的用户ID,为1000

 

(3)在shell命令终端依次输入以下命令,观察执行结果,理解每条命令实现的具体功能

which python

 

whereis python

 

locate python

 

find /usr/bin -name python

 

(说明: which, whereis, locate,find都具有检索的功能,结合执行结果,查找帮助信息,总结其区别)

which查看可执行文件的位置

whereis查看文件的位置

locate配合数据库查看文件位置

find实际搜寻硬盘查询文件名称

 

②grep -n -E 'root|jsj|^user*'  /etc/passwd(提示:扩展正则表达式)

 

 grep  -n  -E  '[[:digit:]]'  /etc/passwd

 

 

grep  -n  -E  '[[:alpha:]]'  /etc/passwd

 

 

grep  -n  '[0-9]\{4,\}'  /etc/group(提示: 在用户组文件中查找GID是4位数及以上的组信息记录)

 

(说明:带选项-E的表示扩展的正则表达式;不带选项-E的是普通的正则表达式)

 grep命令可通过正则表达式搜索文本,并打印匹配到的行;选项-n可打印行号,-E可使用多个正则表达式。

 

③sudo apt-get install gimp

which gimp

 

 sudo apt-get remove gimp

which gimp

 

sudo apt-get install gimp命令可安装gimp

sudo apt -get remove gimp命令可卸载gimp

which gimp用于查看文件的位置。

 

④ls -dl/root --time-style=long-iso

ls -dl /root --time-style=long-iso | cut -d' ' -f1,8

(说明:cut命令的选项-d后引号里有空格;提示: 和前一行结果对比观察)

 

  选项-d可自定义分隔符,-f显示指定的域中的内容,上述命令指定空格为分隔符,显示第1和第8个域中的内容。

 

⑤ls -l --time-style=long-iso

ls -l --time-style=long-iso -t 

ls -l --time-style=long-iso -t -r (说明:依次执行,对比观察,结合帮助选项)

 

 

⑥ls /usr/share/man

 

ls /usr/share/man | grep man[1-8]

 

ls /usr/share/man/man1

 

file /usr/share/man/man1/ls.1.gz(结合执行结果,review2.8.1节gzip命令内容)

 

  file命令可识别文件类型,然后创建新目录temp,将ls.1.gz拷贝至temp目录,gzip命令是进行解压。

 

⑦ls –l /home | grep "^d" | wc –l

 

  ls-l查找在 /home目录下的文件,grep  “^d”过滤行开头为d的文件,wc -l统计行数

 

⑧sudo adduser user7

ls /home | tee users | wc -l (提示:输入cat users观察该文件内容)

sudo adduser命令是用来添加新用户的

 

(4)根据要求写出相应的shell命令

①在目录/usr/include下搜索文件signal.h是否存在(提示: find命令)

 

 

②在/usr/include目录下的所有文件中查找包含BUFSIZ的行,并显示所在行号。要求:屏幕上只显示查找到的结果,过滤错误信息。

(提示:①利用grep和通配符*;②利用错误信息重定向和特殊设备文件/dev/null)

 

 

③在用户名密码文件/etc/passwd中查找登录shell为bash的用户信息记录,并显示行号

(提示:使用grep和正则表达式中的$)

 

④从/etc/group文件中截取第1列(组名)和第3列(组id),并按照组id号的数值大小由小到大排序。(提示:综合使用cut, 管道线及sort命令)

(提交文档时,写出其实现的功能的命令及截图,包括命令和结果在内的截图)

 

(5)体验awk, sed用法:依次执行命令,观察执行结果

①cp/etc/apt/sources.listt1;  less t1

 

 

②sed -e "s/#.*//g"t1

 

 

 ③sed -e "s/#.*//g"t1| awk '{if (length != 0) print $0}'

 

 

④tail -5 /etc/passwd | awk -F: '{print $1}'

 

 

⑤tail -5 /etc/group | tee t2

awk 'BEGIN{print "file t2"} {print "line" NR ":" $0} END {print "over"}' t2

 

(提交文档时,查阅网络,总结如下内容:

①  文件/etc/apt/sources.list用途,理解其内容

 /etc/apt/sources.list是包管理工具apt所用的记录

②  命令工具sed功能,截图显示2~3个自己尝试的sed命令练习,并对具体功能作必要陈述说明

sed可将字符进行替换,上图练习中将hello替换为hi

 

③  命令工具awk功能,截图显示2~3个自己尝试的awk命令练习,并对具体功能作必要陈述说明)

 

   行匹配语句awk 只能用单引号

   每行按空格或tab分割,输出文本中的1,4项;

   awk -F: -F相当于内置变量FS,指定分割字符,在上图练习中使用,分割

 

(6)查阅网络或帮助,体验命令curl和wget用法。

(提交文档时,查阅网络,总结如下内容:

②  命令工具curl功能,截图显示自己尝试的练习,并作必要陈述说明

在linux中curl是一个利用URL规则在命令行下工作的文件传输工具,是一款很强大的http命令行工具,它支持文件的上传和下载,是综合传输工具。

(1)安装curl

 

 

(2)不加任何选项使用curl时,如 curl http://www.baidu.com ,默认会发送GET请求来获取链接内容到标准输出。

 

  

(3)只显示http头,而不显示文件内容,使用-I选项

 

 

(4)同时显示http头和文件内容,使用-i选项。

 

 

(5)将链接保存到文件。使用 > 符号将输出重定向到本地文件中。

 

 

②命令工具wget功能,截图显示自己尝试的练习,并作必要陈述说明

   wget是一个下载文件的工具,它用在命令行下.wget工具功能完善,支持断点下载功能,同时支持FTP和HTTP下载方式,支持代理服务器和设置起来方便简单。

(1)   使用wget下载单个文件,下载的过程中会显示进度条,包含(下载完成百分比,已经下载的字节,当前下载速度,剩余下载时间)

 

 

(2)   使用wget -O下载并以不同的文件名保存。下图练习中,下载一个文件并以名称download1保存

 

    

三. 编写一个shell脚本,使用4种方式(参见第4章教材/课件)分别执行。

(1)练习1

第1步,使用vi/vim/gedit或其它编辑器,编写shell脚本ex1.sh,内容如下:

该脚本的功能是,备份当前目录下最近1天以内(即24小时内)被修改过的普通文件。以backup系统当前日期时间为文件名,并压缩存档。备份过程中出错信息写入error_info。然后分别查看备份文档和报错信息。

 

第2步,尝试第4章介绍的四种方式,运行该脚本,并理解本例中综合使用的shell命令。

 

 

(2)练习2

第1步,使用vi/vim/gedit或其它编辑器,编写shell脚本ex2.sh,内容如下:

尝试第4章介绍的四种方式,运行该脚本。

若提示“找不到文件major_code.txt”,请将公邮实验文件夹中的major_code.txt拷贝至ex1.sh所在目录,重新执行一次。

注:文件major_code.txt,请不要做任何改动,包括格式。

结合运行结果,分析脚本代码,在实验报告中总结以下内容:

 

②  写出line3中read命令选项-n11功能

read用于从键盘读取变量值,11n代表有11位。

-n11表示输入11个字符后输入结束

②写出line14的功能

   Line14:grep $code $filename >t1 && read x major < t1

   功能:搜索code和filename重定向到t1,然后从t1输出到major;

   $code:专业号,是11位学号中的5-8位。

   $filename是major_code.txt.

  

四. 实验总结

      通过本次实验练习,我了解了shell编程,并练习了很多shell命令。shell命令种类繁多,有很多需要自己去反复练习,在练习的过程中也会经常出现各种各样的错误,比如少空格等等。Shell编程很有趣,但需要花更多时间去体验去理解。

转载于:https://www.cnblogs.com/zhao035/p/8979413.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  在Linux系统的/etc目录下有这样一个文件passwd,该文件里包含系统中所有用户信息的记录,记录里包含每个用户的如下信息:用户名、密码、用户ID、组ID、用户全名、用户主目录和用户登录所用的shell。请设计一个脚本shell)程序能实现增加、删除、查找和显示特定用户信息的功能。你们可以通过创建一些UNIX/LINUX shell 脚本文件来满足以上需求。   可以用任意一个文本编辑器打开passwd文件,该文件里包含用冒号分隔开的字段组成的记录,如下所示:   root:x:0:0:root:/root:/bin/bash   zxj:x:500:500:zxj303:/home/zxj:/bin/bash    .    .    .   在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 在屏幕上显示当前所有用户的记录 在屏幕上显示当前所有用户(经过格式化和排序的)的记录 只在屏幕上显示用户名和用户ID 只在屏幕上显示(经过格式化和排序的)用户名和用户ID 查询并显示特定用户的记录 往passwd文件里增加新的用户记录 从passwd文件里删除某个用户记录   你可以使用UNIX/LINUX中一些比较简单的命令或命令组合来执行1、2、3、4、5的任务。对于任务6和7,你需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在你的主脚本menu文件中调用这些脚本文件。   可能你还需要查询一些Unix/Linux命令,比如awk,、sort、tr、cut、paste、sed、grep;你也可能还需要查询其他的Unix/Linux命令。   建议你在主目录下建立一个以 xx xx xx(xx xx xx为学号)命名的目录,并且在本次作业中使用它作为工作目录。 主脚本文件中的菜单   在menu脚本文件里将创建如下菜单,菜单里包含供用户选择的一些操作。 用户信息主菜单 打印当前所有记录 打印当前所有记录(格式化后的) 打印用户名和用户ID 打印(格式化了的)用户名和用户ID 查询特定记录 增加新记录 删除记录 Q——退出 你的选择是:(等待用户输入)   当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。你必须用while循环和case条件语句配合来完成此操作。另外在显示主菜单前必须先清除用户屏幕。在以下所有步骤中,当显示主菜单前都需要先清屏。   在menu脚本文件的前面部分你首先要定义三个变量,这三个变量分别存放passwd、add、delete文件的文件名,并且能在所有涉及到passwd、add、delete文件的语句中使用他们。 比如,可以定义成:           record_file=passwd   在所有访问passwd文件的语句中,只要使用 $record_file 即可。这样做的一个优点就是,如果以后你需要重新命名记录或者需要在不同的记录文件中使用你的脚本的话,你只需要修改以上一个语句而不须在所有有关的记录文件里逐一修改语句。如下定义另外两个变量:   add_file=add   delete_file=delete   定义以上变量之后,你必须核对menu脚本文件,看看所需的文件(passwd、add、delete)是否准确存放在当前目录下。如果其中任何一个不存在,你的脚本menu文件就必须显示以下信息,然后退出:   Required file theMissingFile does not exist.(所需文件不存在)   比如,如果passwd文件不存在,就显示“Required file passwd does not exist.(所需文件记录不存在)”然后退出。   在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续``````”(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。可以允许用户使用Q或q退出。   在以上等待用户做出选择的菜单中,如果用户简单地按了回车键(而不是输代码)的话,就会出现信息“Selection not entered. Press Enter to continue…"(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。   当用户选择了第一项——打印当前所有用户记录   以下是当用户在主菜单中选择第一个选项后,menu脚本文件输出的内容的例子:    (此处是主菜单—略) 你的选择:1(用户输入) root x 0 0 root /root /bin/bash zxj x 500 500 zxj303 /home/zxj /bin/bash . . . . 按回车键继续。。。(等用户按回车键。按后要再次显示主菜单) (注:以上输出内容与passwd文件不同之处在于:空格键代替了所有的冒号。你需要找找哪些Linux命令会这样做。)   当用户选择第二项时——打印当前经过格式化的用户记录后,   以下是当用户在主菜单中选择第二个选项后,menu脚本文件输出的例子:    (此处是主菜单—略) 你的选择:2(用户输入) root x 0 0 root /root /bin/bash zxj x 500 500 zxj303 /home/zxj /bin/bash . . . . 按回车键继续。。。(等用户按回车键。按后再次显示主菜单) (说明:以上格式输出是按用户名排序的。每列应该左对齐。)   当用户选择3时,——打印用户名和用户ID   以下是当用户在主菜单中选择第三个选项后在脚本菜单输出的内容的例子:    (此处是主菜单—略)   你的选择:3(用户输入)   root,0   zxj,500    .    .    .    . 按回车键继续。。。(等用户按回车键。按后再次显示主菜单) (注意 以上输出与passwd文件内容之间的不同之处。冒号已被逗号代替。每个表目[记录]只有显示姓名和电话号码。)   当用户选择4时,——打印(格式化的)用户名和用户ID      以下是当用户在主菜单中选择第四个选项后在脚本菜单输出的内容的例子: (此处是主菜单—略)   你的选择:4(用户输入)   root 0   zxj 500       .    .    . 按回车键继续。。。(等用户按回车键。按后再次显示主菜单)   当用户选择5时,——查找特定的记录   以下是当用户在主菜单中选择第五个选项后在脚本菜单输出的内容的例子:   (此处是主菜单—略)   你的选择:5(用户输入)   输入关键字:Jones (用户输入)   Jones:x:600:600:Jones Sarah:/home/Jones:/bin/sh    按回车键继续。。。(等用户按回车键。按后再次显示主菜单)   如果输入的关键字不在记录里,则必须输出相关信息,示例如下: (此处是主菜单—略) 你的选择是:5(用户输入) 输入关键字:Monks (用户输入) 没有找到Monks 按回车键继续。。。(等用户敲回车键。之后再次跳出主菜单)   如果用户简单地按回车键而不是输入关键字,就要产生以下输出:    (此处是主菜单) 你的选择是:5(用户输入) 输入关键字:(用户简单地按回车键没有输入任何东西,即没有键入关键字) 没有输入关键字 输入关键字:(仍然等待用户的输入)   可以允许输入的关键字不区分大小写(例如JONE和jone的输出结果是一样的) 你的add脚本文件   当用户在主菜单里选择6时你的add脚本文件就要被调用,以下是增加功能的输出示例:    (此处是主菜单—略) 你的选择是:6 (先清屏)             用户信息增加情况 输入新用户的具体情况 用户名: 密码: 确认密码: 用户ID: 组ID: 用户全名: 用户主目录: 登录shell:   你的脚本文件必须能使用户输入一个有效的用户ID(数字、一般非超级用户的ID大等于500)。你的脚本文件必须能够识别用户输入的ID。 如果用户只是简单的按回车键,就要输出以下内容: 用户ID(xxxx):(由用户简单的按回车) 没有键入ID 用户ID:(xxxx):(等待用户输入一个有效的ID) 如果用户输入的是一个无效的ID或者是不符合格式的ID,就要输出以下信息: 用户ID:(xxxx): abc123 (用户输入) 无效ID 用户ID:(xxxx): (等待用户输入一个有效的ID) 对组ID的要求类似与用户ID 用户名:Warren (用户输入)   一个有效的用户名必须只含字母和数字。类似以上所说的,如果用户输入一个无效的用户名,就应该显示这样的信息:“用户名只包含字母和数字”,并且提示用户再次输入姓。如果用户只按回车没有输入的话,则显示信息:“没有输入用户名”,并提示用户再次输入姓。 密码:****** (用户输入)   输入密码时不显示或显示*,要求密码长度至少达到6位以上、且由大小写字母、数字和控制字符组成;确认密码如果与密码不符应该让用户重新输入。 主目录:Todd(非用户输入,但要根据用户名正确显示)   一个有效的主目录名必须根据用户名在/home目录下正确地添加,要求能在passwd文件中的相应记录上自动添加主目录名,还要在/home 目录下自动建立该名字的目录(可以暂不做)。 登录shell:bash(用户输入)   一个有效的shell必须只能是bash、sh、kash、csh中的一种。如果用户输入一个无效的shell名,就会显示这样的信息:“输入的shell名不在本系统范围内!”,并且提示用户再次输入。如果用户只按回车没有输入的话,则显示信息:“没有输入!”,并提示用户再次输入shell名。 保存记录 (此信息只在成功增加新记录之后才显示,如果新的记录没有成功增加则不能显示次信息。在后面的例子里,用把内容添加到已存在文件上的UNIX命令显示一个标准的错误信息)。 再增加一个吗?(是)或(否):是(用户输入) (以上过程从“首先清理用户屏幕”开始,然后重复。   然而,如果用户输入了N,增加记录操作就要退出,然后显示主菜单,以便用户能做其他选择,(比如,现在用户可能想要浏览记录文件中的内容以便确认新记录是否已经添加进文件。)   如果用户偶然打进一个代码而非Y或N,就会退出增加记录操作并显示主菜单。   在add脚本文件的开始,你必须定义一个变量,这个变量存放passwd文件的文件名,并且能在所有涉及到passwd文件的语句中使用它。 在你的shell程序全部完成后你可以自己编三条记录添加到passwd文件中。 你的delete脚本文件    当用户在主菜单中选择7时,你的delete脚本文件必须被调用。下面是示例:    (主菜单如下) 你的选择:7(用户输入) (先清屏)删除用户记录 输入用户ID(xxxx): 500(用户输入) zxj:x:500:500:zxj303:/home/zxj:/bin/bash   你的delete脚本必须要求用户输入有效的用户ID,要求同add脚本。若有用户输入一个无效的用户ID,应显示信息:“无效的用户ID!”,并再次提示用户输入一个用户ID。如果用户简单的按回车键而没有任何输入,显示信息:“没有输入!”,并提示用户再次输入一个用户ID。) 确认删除:(是)或(否):是(用户输入) 记录删除。(此信息只在成功删除新记录之后才显示,如果记录没有成功删除则不能显示此信息。在后面的例子里,UNIX系统将会显示一个标准的错误提示信息)。 (如果用户输入N或者除了Y或N以外的字母的话,删除操作应该退出并显示主菜单。这样能保证用户按Y来删除一个记录) Delete another? (y)es or (n)o: y (user input) 再删除一个?(是)或(否):是(用户输入) (以上过程从清屏开始并不断重复) 如果用户输入N或者除了Y或N的字母外,就退出删除操作,显示主菜单。 然而,如果找不到包含有键入用户ID的记录的话,就要输出以下信息: 删除用户记录 输入用户ID(xxxx):5555 (用户输入) 没有找到5555 按回车继续…… (务必使鼠标停留在信息末尾。等用户按了回车后,跳出主菜单。)   在你的delete脚本文件的开始处,你必须定义一个变量,这个变量存放passwd文件的文件名,并且能在所有涉及到passwd文件的语句中使用它。 对大作业的要求:    必须包含你的姓名,学生号以及你的SHELL脚本文件如何使用的简介。你还必须确认在Bash SHELL中可以运行你的脚本文件。为了使你的脚本文件输出更具有可读性,请在合适的地方用”\n”和注释。还要考虑脚本的结构和布局。     如何交你的作业:    你需要分别以硬拷贝(书面形式)和电子文档形式(副本)提交你的shell编程大作业。   你必须提交一份硬拷贝(有一个写上名字的装订好的封面)和一份含下面四个文件的电子拷贝(三份SHELL脚本和一份文本文件)。   menu、add、delete、passwd

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值