实验四 shell 编程

实验四shell 编程

 

一、实验目的

 

1、了解 shell的作用和主要分类。

2、掌握 shell环境变量、管道、输入输出重定向的使用方法。

3、掌握  shell脚本的建立和执行方式。

4、熟悉  shell脚本的基本结构。

5、掌握 shell脚本的调试方法。

二、实验内容

1、使用shell变量、位置参数和环境变量。

2、建立shell脚本并执行。

3、使用 shell一般控制结构编写脚本。

4、调试 shell脚本。

三、实验步骤

1、了解shell变量、位置参数和环境变量

1)输入以下命令,记录输出结果并分析。

#dir=/root

# echo$dir

# echodir

实验四 shell 编程_第1张图片

 2)输入以下命令,记录输出结果并分析。

# read a b c   www hnistcn

         # echo "Web :$a.$b.$c"

实验四 shell 编程_第2张图片

2、建立简单Shell脚本文件

1)新建Shell脚本文件test_shell_0,编辑内容如下。

cd/var/log

cat /dev/null >messages       #/var/log/message:几乎所有的开机系统发生的错误都会在此记录

cat /dev/null >wtmp            #/var/log/wtmp:记录登录者讯录,二进制文件echo "Logs cleanedup."

实验四 shell 编程_第3张图片

2)采用多种方式运行test_shell_0脚本,记录输出结果并分析功能。

3、简单shell脚本文件改良

1)新建shell脚本test_shell_1,编辑内容如下。

#!/bin/bash

LOG_DIR=/var/logcd$LOG_DIR

cat /dev/null >messages

cat /dev/null > wtmpecho"Logscleanedup."exit

实验四 shell 编程_第4张图片

2)运行test_shell_1脚本,与test_shell_0对比,说明各行的作用。在第一行后加上注释,再运行脚本,记录结果并分析。

相关知识点

执行 shell 脚本有以下几种方式

  1. 相对路径方式,需先 cd到脚本路径下

 代码如下:

[root@banking tmp]# cd/tmp[root@bankingtmp]#./ceshi.sh

脚本执行成功

2、绝对路径方式

代码如下:

[root@banking tmp]#/tmp/ceshi.sh

脚本执行成功

 3、bash命令调用代码如下:

[root@banking /]# bash/tmp/ceshi.sh

脚本执行成功

4、.(空格)相对或绝对方式

代码如下:

[root@banking/]#./tmp/ceshi.sh

几种方式的区别

第一种和第二种没有什么区别,两种方式都需要提前赋予脚本以执行权限。

第三种是把脚本当做bash的调用来处理,所以,脚本不需要有执行权限就可以执行。

前三种方式都是在当前 shell 中打开一个子 shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。

第四种是使脚本内容在当前shell里执行,而不是单独开子shell执行。

开子shell与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell中设置的当前变量,不做特殊通道处理的话,父shell是不可见的。

而在当前shell中执行的话,则所有设置的环境变量都是直接生效可用的。

4、简单shell脚本文件优化

1)新建shell脚本test_shell_2,编辑内容如下。

 

#!/bin/bashLOG_DIR=/var/logROOT_UID=0LINES=50E_XCD=66E_NOTROOT=67

if["$UID"-ne"$ROOT_UID"]

then

echo "Must be root to run thisscript."

exit $E_NOTROOT

fi

if [ -n "$1" ]   #测试是否有命令行参数(非空).

then

lines=$1 

else

lines=$LINES#     如果不在命令行中指定,使用默认

fi

cd$LOG_DIR

if [ `pwd` != "$LOG_DIR" ]

then

echo "Can not change to $LOG_DIR."

exit $E_XCD

fi

tail -$lines messages > mesg.temp

mv mesg.temp messages

cat /dev/null > wtmp 

echo "Logs cleaned up." 

exit 0

实验四 shell 编程_第5张图片

2)运行test_shell_2脚本,与test_shell_1对比,说明其新增的功能。

实验四 shell 编程_第6张图片

四、应用实例

  1. 设计Script时,我们经常会利用sed置换系统配置文件里的关键词,以开启或关闭某个设置选项。如果想开启vsftpd的匿名登陆的功能该sed脚本如何设计?

提示:开启ftp工具vsftpd的匿名登陆功能只需要把其配置文件(/etc/vsftpd.conf)中anonymous_enable选项射程YES就可以了。

实验四 shell 编程_第7张图片

  1. 利用awk获取网卡的IP,网络设备名称以及系统内存大小

网卡的ip(试用各种方法但无结果)

实验四 shell 编程_第8张图片

网络设备名称

系统内存大小

  1. 修改CSV文件各字段的顺序:

以下是数据文件dataf.csv,想要把其第2个字段和第4个字段调换位置:

书名,主编,书号,出版社,定价(元),出版时间

大学生心理健康教育实用教程,邓彦,978-7-313-15714-0,北京大学,36.00,2016.8

大学生职业生涯规划,牛荣健,978-7-313-15538-2,上海交大,36.00 ,2016.8

创业管理与实务,蒋键,978-7-313-15633-4,浙江大学,36.00,2016.5

体育与健康,王峰,978-7-313-14769-1,上海交大,35.00,2016.5

创新创业与生涯发展实务指导,陈志国,978-7-313-15819-2,浙江大学,39.50,2016.6

概率论与数理统计(双色版),邓光明,978-7-313-17748-3,上海交大,34.00 ,2017.7

法律逻辑应用教程,吴诚,978-7-313-17952-4,北京大学,34.00,2017.4

实验四 shell 编程_第9张图片

实验四 shell 编程_第10张图片

五、思考题

  1. 编写一个shell脚本,它带一个命令行参数,这个参数是一个文件。如果这个文件是一个普通文件,则打印文件所有者的名字和最后的修改日期。如果程序带有多个参数,则输出出错信息。

实验四 shell 编程_第11张图片

  1. 编写一个bash脚本程序,用for循环实现将当前目录下的所有.c文件移到指定的目录下,最后在显示器上显示指定目录下的文件和目录。

实验四 shell 编程_第12张图片

实验四 shell 编程_第13张图片

  1. 编写一个名为dirname的脚本程序,它将参数作为一个路径名,并将该路径前缀(不包含最后部分的整个串)写到标准输出。

实验四 shell 编程_第14张图片

实验四 shell 编程_第15张图片

实验四 shell 编程_第16张图片

 

  1. 编写一个累加器脚本程序,用Fiboracci数列的前10个数做参数。

实验四 shell 编程_第17张图片

实验四 shell 编程_第18张图片

  1. 写一个shell脚本,包含两个数字数组array1和array2,分别初始化为{1,2,3,4,5}和{1,4,9,16,25}。脚本生成并显示一个数组,其中的元素是这两个数组中对应元素的和,数组中第一个元素是1+1=2,第2个元素是2+4=6等。

实验四 shell 编程_第19张图片

  1. 某工厂产管理员hnsd负责统计各车间每产产品数据计算机安装双硬盘保证数据安全该管理员每午12:00每午17:30必须数据进行双硬盘备份需要备份数据存放于/home/hnsd/workdata/目录备份数据别存放于/home/hnsd/disk1backup/(第块硬盘)/dev/disk2backup/(第二块硬盘)目录且文件名形式yyyymmdd_workdata1.tar.gz(午备份文件)yyyymmdd_workdata2.tar.gz(午备份文件)其yyyy、mm、dd别月

(1) 设计shell程序实现该任务

(2) 编写crontab文件实现述任务自调度

创建自己的帐户 

实验四 shell 编程_第20张图片

注销并登录自己的帐户,创建备份文件

实验四 shell 编程_第21张图片

 编写 autobackupdata1.sh命令

 

编写 autobackupdata2.sh命令

编写crontab文件实现对上述任务的自动调度crontab –e

切换到root账户,修改系统时间为上午11:59:50

实验四 shell 编程_第22张图片

实验四 shell 编程_第23张图片

【提示】获取格式yyyymmdd前期:

1)别获取月进行组合

yyyy=`date +%Y`

mm=`date +%m`

dd=`date +%d`

则$yyyy$mm$dd即文件名前期部

2)直接获取格式yyyymmdd前期

yyyymmdd=`date +%Y%m%d` 

则$yyyymmdd即文件名前期部

六、心得体会

  此实验为第四次实验,也是迄今为止难度大的实验,之前的那些都是基本操作,但是这节实验就涉及到了一些专业知识,如果不熟悉,进度就很慢,有些命令不熟悉,我就在书上找相关知识点,但是不齐全,再去找百度,才能勉强熟悉知道意思,但是学以致用对我来说还是有难度的,本实验最后一道题我不是很能理解,虽然网上也有例子,但是我尝试一下,有错误但是不知道错在哪,可能是因为没有真正的理解所以才不会学以致用。

 

你可能感兴趣的:(Linux实验)