linux中shell 循环处理每天数据linux操作系统

关键词: 命令 学生 编程 教学

linux中shell 循环处理每天数据linux操作系统(共6篇)

篇1:linux中shell 循环处理每天数据linux操作系统

这篇文章主要介绍了Linux shell实现每天定时备份mysql数据库的代码,分享给大家,希望大家能够喜欢,

每天定时备份mysql数据库任务,删除指定天数前的数据,保留指定天的数据;

需求:

1,每天4点备份mysql数据;

2,为节省空间,删除超过3个月的所有备份数据;

3,删除超过7天的备份数据,保留3个月里的 10号 20号 30号的备份数据;

#创建shell文件vim backup_mysql.sh mysqldump -uroot -p123456 --all-databases >/data/dbdata/mysqlbak/`date +%Y%m%d`.sqlfind /data/dbdata/mysqlbak/ -mtime +7 -name ‘*[1-9].sql‘ -exec rm -rf {} ;find /data/dbdata/mysqlbak/ -mtime +92 -name ‘*.sql‘ -exec rm -rf {} ; #创建定时任务crontab Ce0 4 * * * /data/dbdata/backup_mysql.sh

以上所述就是本文的全部内容了,希望对大家能够熟练掌握shell脚本有所帮助,

篇2:linux中shell 循环处理每天数据linux操作系统

代码如下复制代码

#!/bin/bash

mysql -u* -h* -p* <

Your SQL script.

EOF

例如:

代码如下复制代码

#!/bin/bash

mysql -uroot-ppassword <

use chbdb;

CREATE TABLE user (

id varchar(36) NOT NULL,

username varchar(50) NOT NULL,

password varchar(50) NOT NULL,

createdate date NOT NULL,

age int(11) NOT NULL,

PRIMARY KEY(`id`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

EOF

缺点:

篇3:linux中shell 循环处理每天数据linux操作系统

化学实验常常涉及大量的数据,如何对得到的实验数据进行分析和处理关系到实验的成功和失败。随着计算机科学的发展,目前已有很多软件可以帮助研究人员完成实验数据的分析和处理工作,如Ms Excel、ORIGIN、Matlab等。这些商业化的计算软件价格昂贵,一般人难以承受,免费使用的“开源”软件为人们解决了这一问题。

SCILAB是一种类似于Matlab的科学计算软件,但它是开放源码的自由软件。SCILAB的开发者是法国国家信息自动化研究院(INRIA)和法国著名的国立桥路大学(ENPC)的研究人员。SCILAB的数据类型丰富,可以很方便地实现各种矩阵运算与图形显示,能应用于科学计算、数学建模、信号处理、决策优化、线性/非线性控制等各个方面。SCILAB具有良好的数据可视化功能,它可以将数据用二维或三维图形表现出来。SCILAB可运行于目前流行的多种操作系统中上,如Windows,Unix,Linux,Mac。

在红旗Linux6.0系统下用SCILAB处理实验数据,减少计算工作量,得到准确的结果。

2 安装

SCILAB的Linux版本可以从http://www.scilab.org/下载得到。安装程序分源代码版和二进制版,其最新版本号是5.2.2。为方便起见,用的是最新的SCILAB5.2.2二进制版,这样可以不用再编译,减少因缺少某些库文件而带来不必要的麻烦。

得到SCILAB5.2.2的Linux版本后直接将其解压到某个目录下(如/usr/local),将在该目录下建立SCILAB5.2.2子目录。然后进入./scilab5.2.2/bin,在控制台下运行scilab即可启动SCILAB。为了方便,可以在桌面上建立一个快捷方式。假设一root身份登录,则为SCILAB建立桌面快捷方式的具体命令如下:

3 用SCILAB对实验数据进行分析和处理

3.1 统计计算

在SCILAB的统计工具箱中提供了大量的数理统计方面的函数可以调用,如计算样本平均值函数mean(X),计算样本标准差函数stdev(X)等。这里的X可以是向量或矩阵。表1为某次对一样本浓度测定的10次测试数据。计算其平均值和标准偏差如下:

计算结果,平均值Xmean=0.4346μg/ml,标准偏差Xst-dev=0.0175。

3.2线性回归

在化学实验数据处理中,经常需要用线性回归分析和拟合来处理实验数据。例如光度分析中浓度和吸光度之间通常情况下是线性关系,即y=ax+b[1]。但由于在实验过程中误差不可能完全避免,因而实验点不可能完全通过该直线,而是比较分散地落在直线的周围,若只凭人眼观察手工画出工作曲线,其误差将会很大,因此需要对实验数据进行回归分析。SCILAB提供的reglin(x,y)函数能很方便地进行回归分析,其调用方式如下:

其中,a、b分别为斜率和截距,sig为标准残差。

如以分光光度法测定Zn为例,测得的吸光度值如表2所示[1]。

利用SCILAB进行线性回归计算如下:

计算结果a=0.0515,b=0.001,sig=0.0014。

用plot2d(x,A,-1)和plot2d(x,A,2,'000')命令绘出线性回归图形如图1所示。

3.3 非线性拟合

线性回归方法大都是假设分析体系为现行加和体系,但在某些实际的分析过程中,这一假设并不能得到满足,尤其是在分析一些混合体系时,常常出现一些非线性情况[2]。这些非线性函数f(x)往往很复杂,甚至有的函数很难找到它的解析表达式,对此,可以采用插值的方法解决。所谓插值就是在原始数据之间按一定关系插入新的数据点,以便分析数据变化规律[3]。SCILAB提供了两个插值函数,分别是线性插值函数interpln和样条插值函数interp。线性插值函数interpln仅通过连接相邻的两个数据点即可以得到对应于x坐标值的函数值y;样条插值函数interp根据原始数据点的坐标及该点的一阶导数进行插值。

其中,xp为指定插值点的x坐标,x,y,d分别为原始数据点的x、y坐标及其一阶导数;yp为插值点的y坐标,yp1、yp2、yp3分别为插值点上的一、二、三阶导数

另外,SCILAB还提供了另一个样条函数splin配合interp,用来求取三次样条。Splin调用方式为:

其中,x为原始数据点的横坐标,必须单调上升;y为原始数据点的纵坐标;d为一阶导数向量。

下面以一组仿真数据为例说明如何用SCILAB的interp样条插值函数进行数据的非线性拟合。具体数据如表3所示。

计算方法如下:

结果如图2所示。

4 结语

对化学实验中出现的大量数据,一般情况下若用人工分析处理将会很困难,并会产生很大误差。本文讨论了如何在Linux系统下利用SCILAB对化学实验数据进行分析和处理。结果表明,用SCILAB所提供的函数对实验数据进行分析处理将非常方便,并大大减小误差。通过SCILAB提供的的图形功能利用实验数据绘制图形,直观地显示了实验的结果。

参考文献

[1]黄一石,吴朝华,杨小林.仪器分析[M].第2版.北京:化学工业出版社,2008.

[2]程翼宇,瞿海斌.医药分析信息学及分析数据处理技术[M].北京:化学工业出版社--生物医药出版分社,2006.

篇4:linux中shell 循环处理每天数据linux操作系统

关键词:数据备份 Linux Rsync

中图分类号:TP309.3文献标识码:B 文章编号:1673-8454(2009)19-0027-02

校园网建设的工作重心主要集中在保证网络的正常运行和提供良好的网络服务。除此以外,数据备份也是网络管理员的重要职责之一。对数据进行自动远程备份是保证数据安全的有效方法。

一、现状

校园网中的应用系统,比如计费系统和电子邮件系统中积累了大量的用户数据,包括用户的费用和邮件等重要信息,对于此类敏感又很重要的数据一定要做好备份。这些数据具有实时性的特点,即信息随时都在发生动态变化。因此,要求能够对数据做到周期性自动跟踪,反之,需要恢复数据时能够恢复到离故障点较接近的时间点,丢失的数据尽可能少且在大多数用户的可接受范围内。

目前我校没有为备份提供专用的存储空间,在这种情况下,可以使用一台性能相对稳定并且磁盘空间较大的已被替换下来的服务器,作为存储平台。同时能够找到一种相对灵活的备份方案实现备份需求。但是用什么方法将数据传输过来呢?

二、选择方案

由于我校大多数应用系统都使用Linux操作系统,在Linux操作系统中数据备份方法通常有:(1)Linux系统中常用的备份工具tar、dump、restore等,但这些工具大多数适合本地备份,对不同主机之间的远程备份往往力不从心。(2)选择商业化的备份和镜像产品,但是这种产品通常价格昂贵。对于价格高的项目需要审批,从立项到实施周期长。(3)编写脚本,使用FTP等工具定时传输数据,但是这种方法的缺点是每次都要将所有文件和数据重新传输一遍,将要备份的文件和已备份文件没有比较,不考虑哪些文件是新增加的和更新的。当需要备份的数据量较大时,更是需要较长时间的网络传输,效率低。(4)使用自由软件——远程传输工具Rsync,Rsync是一个小巧而灵活但是功能强大的远程备份工具,它使用“Rsync演算法”提供一个非常快速的文件传输方法,使得本地和远端主机间的文档达到同步。Rsync只有第一次备份时需要传输所有数据文件,以后传输数据时会比较两组数据,相同的不再传输,只传输发生变化的数据部分,因此速度相当快,而且节省网络带宽。由此可以看出,选择Rsync做备份工具是最佳选择。

三、制定备份策略

实时数据备份对服务器和网络带宽的要求较高,因为不停地备份会降低服务器性能,而且会造成网络负荷过重。与提供良好的网络服务相比,数据备份应该是第二位的,当出现争抢资源时应该让位于网络服务。因此需要制定一个折中的策略——选择一个合适的时间间隔。白天服务器的访问量大,用户操作频繁,此时不适宜做备份,而晚上的访问量相对较低,系统和网络都处于空闲的状态,此时做备份既可利用系统的低使用率也不会增加网络负载。因此,选择每天凌晨备份,一天的数据差别在用户的可接受范围内。

四、实施方法

Rsync是以服务器/客户端的方式工作的,较为特殊的一点是Rsync服务器和客户端都使用同一个程序。启动服务器的时候需要指明以daemon方式运行,表明启动的是服务器。而启动客户端程序的时候则不需要指定daemon选项。

每台需要备份数据的服务器在设置上都类似,因此以一台服务器和一组待备份数据为例。例如,需要备份数据的服务器IP地址为10.0.0.1,该主机称之为Rsync-server,程序以daemon方式运行;作为存储平台的主机IP地址为10.0.0.200,运行Rsync客户端程序,该主机称之为Rsync-client。Rsync程序默认运行在TCP的873端口,即Rsync-server会监听873端口,等待对方的rsync连接。当以认证方式登录时,Rsync-server与Rsync-client连接时会检查密码是否相符,如果相符则开始文件传输。

1.Rsync-server(10.0.0.1)的配置

Rsync-server需要设置以下几项:

明确需要建立备份的目录

设置/etc/xinetd.d/rsync

设置/etc/rsyncd.conf

设置密码文件

(1)目录/udata以及子目录中存有用户数据,需要备份。

(2)设定/etc/xinetd.d/rsync,确保文件中两个参数:

disable = no

server_args = --daemon

使用命令service xinetd restart,使设置生效,使rsync服务进程以daemon方式运行rsync。

(3)Rsync服务器最重要最复杂的就是配置文件/etc/rsyncd.conf,这个配置文件控制着Rsync服务器的认证、访问、日志、可用模块等信息。该文件由一个或多个模块结构组成。一个模块定义是以方括弧中的模块名开始,直到下一个模块名或者文件结束。每个模块对应一个需要备份的目录。配置文件以行为单位,模块中的行是一些参数赋值或注释等。

uid = root

read only = yes

list = no

log file = /var/log/rsyncd.log

pid file = /var/run/rsyncd.pid

hosts allow = 10.0.0.200

hosts deny = 0.0.0.0/32

[userdata]

path = /udata

ignore errors

read only = yes

list = no

auth users = secretuser

secrets file = /etc/rsyncd.secrets

前五行指定在daemon模式下运行的Rsync-server是以root用户的只读方式运行,指定日志和运行时的进程ID的存放位置,以及允许连接的Rsync客户端地址等。这些选项是全局的。在模块[userdata]中指定了需要备份的目录,忽略了一些无关的IO错误,不允许列文件,备份时需要认证,及密码文件的存放位置等。

(4)密码文件的格式很简单,账号:密码。例如,/etc/rsyncd.secrets的内容可设为:

secretuser:secretpasswd123

注意,一定要设置密码文件的属主和权限,否则备份会失败。

#chown root.root rsyncd.secrets

#chmod 600 rsyncd.secrets

2.Rsync-client(假设主机地址为10.0.0.200)的配置

Rsync需要设置如下几项:

规划一个容量足够大的独立分区,并设置好存储目录

编写备份指令文件

将指令加入crontab列表中,完成定时备份

(1)设置存储目录为/backup。

(2)编辑文件rsync-restore,并存放在某一目录下,比如/目录下,文件内容为:

rsync-tvzrp-progress-delete secretuser@10.0.0.1::userdata /backup-passwd-file=/etc/rsyncd.pass

命令参数-tvzrp中的v是将传输过程显示到屏幕中,z是传输时压缩数据,r是逐级保留目录目录下文件,tp是保持文件原有属性如权限、时间等参数。-progress指示详细的进度。-delete删除在Rsync-client上存在而Rsync-server上不存在的额外文件,精确保存副本。这一选项对邮件服务器很有实施价值,如果不删除已经不存在的文件,比如用户邮件,当恢复数据时,被用户删除过的邮件又会出现在用户的邮箱当中,这种莫名其妙的事情发生会给用户造成困扰。-passwd-file:指定用于rsync服务器的用户验证密码。/etc/rsyncd.pass文件中指定访问密码,内容为:secretpasswd123(与Rsync-server的/etc/rsyncd.secrets文件中密码一致),设置文件权限为读写 #chmod 600 rsyncd.pass。

注意,要修改rsync-restore文件的权限,否则备份不会成功。

#chmod 755 rsync-restore

(3)使用crontab命令定时备份文件,编辑如下内容:

0 2 * * * /rsync-restore

这样,每天凌晨2点Rsync-server就将待备份目录/udata以及目录下的文件以目录树结构做镜像自动备份到Rsync-client的/backup目录下。

五、结束语

当需要恢复数据时,在保证重新架设的应用服务程序与原服务程序保持一致的前提下,只要将备份的整个目录树恢复到服务器相应目录下即可。注意,备份实施过程中设置rsync相关文件时,一定要设置使用权限,否则将导致备份失败。一般来说,备份用户数据比备份系统数据更频繁一些,合理规划备份方案,明确备份的内容、备份时间及备份方式,并进行适时备份可以有效防止重要数据的丢失。在日常工作中,备份是管理员的一项重要工作,掌握好备份技巧对管理员的工作很有帮助。

参考文献:

[1]用Rsync对网站进行镜像备份[EB/OL]. http://fanqiang.chinaunix.net/a6/b7/20010908/1305001258_b.html

[2]Linux下的远程备份(镜像)工具Rsync[EB/OL]. http://wuwd.blog.ubuntu.org.cn/2007/12/22/

篇5:Linux的shell探索

让我们首先简单介绍一下现代shell的发展历史, shell是一种小语言, 是一种特殊的、特定于领域的语言, 它们实现一种特定的使用模型。除了基于文本的命令行shell, 还可以找到图形用户界面shell, 以及用于语言的shell (比如Python shell或Ruby的irb) 。shell理念甚至可以通过一个名为goosh的Web前端应用到Web搜索中, 这个基于Google的shell允许使用命令对Google执行命令行搜索, 比如search、more和go。

贝尔实验室的肯·汤普逊 (Ken Thompson) 于1971年开发了第一个用于Unix的shell, 名为V6 shell, 它是以Multics上的shell为模范而改写的, 这个shell (/bin/sh) 是一个在内核外部执行的独立用户程序。globbing (参数扩展的模式匹配, 比如*.txt) 等概念是在一个名为glob的独立实用程序中实现的, 就像用于评估条件表达式的if命令一样。这种独立性可保持shell很小, 只需不到900行C源代码。该shell为重定向 (<>和>>) 和管道 (|或^) 引入了一种紧凑的语法, 这种语法已延续到现代shell中。Thompson shell也实现对调用顺序命令 (使用;) 和异步命令 (使用&) 的支持, 但缺少的是编写脚本的能力, 它的唯一用途就是用作一个交互式shell (命令解释器) 来调用命令和查看结果。

1977年引入Bourne shell由Stephen Bourne在贝尔实验室为Version 7 Unix创建, 它在如今仍然是一个有用的shell, 甚至在一些情况下还被用作默认的根shell。

Bourne shell有两个主要目标:用作一个命令解释器来交互式执行操作系统命令, 以及用于编写脚本 (可通过shell调用的可重用脚本) 。除了取代Thompson shell, Bourne shell还提供了相对于其前身的多项优势。Bourne向脚本中引入了控制流、循环和变量, 提供了一种更加强大的语言来与操作系统交互, 包括交互式和非交互式。该shell还允许使用shell脚本作为过滤器, 提供对处理信号的集成支持, 但缺乏定义函数的能力。最后, 它整合了我们如今使用的许多功能, 包括命令替换 (使用反引号) 和用于将保留的字符串文字嵌入到脚本中的HERE文档

Bourne shell不仅是向前发展的重要一步, 也是众多衍生的shell的基础, 其中许多shell如今应用在典型的Linux系统中。Bourne shell导致了Korn shell (ksh) 、Almquist shell (ash) 、Debian Almquist shell (dash) 、Z shell (zsh) 和流行的Bourne Again Shell (Bash) 的开发。在Bourne shell发布时, C shell (csh) 正在开发。

基本架构类似一个管道, 其中会分析和解析输入, 展开符号 (使用各种方法, 比如括号、波浪号、变量、参数扩展和替换, 以及文件名生成) , 最终执行命令 (使用shell内置的命令或外部命令) 。

基本上shell分两大类:

一:图形界面shell (Graphical User Interface shell即GUI shell)

例如:应用最为广泛的Windows Explorer (用于微软的Windows系列操作系统, 并非IE浏览器) , 还有也包括广为人知的Linux shell, 其中Linux shell包括X Window Manger (Black Box和Flux Box) , 以及功能更强大的CDE、GNOME、KDE、XFCE。

二:命令行式shell (Command Line Interface shell, 即CLI shell)

例如:bash/sh/ksh/csh (Unix/Linux系统) 、COMMAND.COM (MS-DOS系统) 、cmd.exe/命令提示字符 (Windows NT系统) 、Windows Power Shell (支持.NET Framework技术的Windows NT系统) 。

传统意义上的shell指的是命令行式的shell, 一般如不是特别注明, shell是指命令行式的shell。现在让我们看看其中一些shell, 回顾它们所做的贡献以及它们在每个shell中如何查看示例脚本。查看的内容包括C shell、Korn shell和Bash。

Tenex C shell

C shell是Bill Joy 1978年在加州大学伯克利分校攻读研究生期间为BSD Unix系统开发的。该C shell的一个重要的设计目标是创建一种类似C语言的脚本语言。这是一个有用的目标, 因为C语言是所使用的主要语言 (此外, 该操作系统也是主要使用C语言开发的) 。

Bill Joy在C shell中引用的一项有用功能是命令历史。此功能维护以前执行的命令的历史, 允许用户检查并轻松选择之前的命令来执行。

一个tcsh脚本可分解为3个基本部分。首先, 使用了shebang或hashbang符号来将此文件声明为可由定义的shell可执行文件 (在本例中为tcsh二进制文件) 解释。这允许我们以常规可执行文件的形式执行该文件, 而不在它之前添加解释器二进制文件。它维护找到的可执行文件数量, 所以将此数量初始化为0。

Korn shell

Korn shell (ksh) 由David Korn设计, 是在与Tenex C shell相同的时期引入的。Korn shell在2000年以开源形式发布 (依据Common Public License) 以前一直是专用的软件。除了提供与Bourne shell强大的向后兼容性, Korn shell还包含其他shell的功能 (比如csh的历史功能) 。该shell还提供了可在现代脚本语言 (比如Ruby和Python) 中找到的一些更加高级的功能。

Korn shell是Bourne shell的衍生物, 因此看上去更像Bourne shell和Bash而不是C shell。

在结构上, Korn shell和tcsh脚本基本上是相同的, 但在执行条件、表达式和迭代的方式上存在明显的区别。没有采用类似C的测试操作符, ksh采用了典型的Bourne风格操作符 (-eq、-ne和-lt等) 。

Korn shell也有用一些与迭代相关的区别。在Korn shell中, 使用了for in结构, 使用命令替换来表示从命令ls'$1/* (表示指定子目录的内容) 的标准输出创建的文件列表。

除了上面定义的其他功能, Korn还支持别名功能 (用于将一个词替换为用户定义的字符串) 。Korn还有其他许多功能默认已禁用 (比如文件名称完成) , 但可由用户启用。

Bourne-Again Shell

Bourne-Again Shell (或Bash) 是一个开源GNU项目, 旨在取代Bourne shell。Bash由Brian Fox开发, 已成为世上最流行的shell之一。除了支持脚本的向后兼容性, Bash还整合了来自Korn和C shell的功能。您将找到命令历史、命令行编辑、一个目录栈 (pushd和popd) 、许多有用的环境变量和命令完成等。

Bash继续在发展, 拥有许多新功能, 支持正则表达式 (类似于Perl) 和关联数组。下例中所示的示例脚本等同于Korn shell脚本, 除了shebang区别 (/bin/bash) 。

这些shell之间的一个关键区别是它们的发布所依据的许可。Bash是在GNU项目中开发的, 是依据GPL发布的, 而csh、tcsh、zsh、ash和scsh都是依据BSD或一种类似BSD的许可来发布的。Korn shell可依据Common Public License使用。

对于大胆的开发人员, 可基于需要或爱好使用替代的shell。Scheme shell (scsh) 提供了一种使用Scheme的脚本环境。Pyshell是对创建使用Python语言的类似脚本的一次尝试。最后, 对于嵌入式系统, 可以使用Busy Box, 它将一个shell和所有命令合并到一个二进制文件中, 以简化其分发和管理。

篇6:linux中shell 循环处理每天数据linux操作系统

关键词:Linux Shell 命令行 Shell编程

中图分类号:G434文献标识码:A 文章编号: 1673-1875(2009)03-105-02

一、问题的提出

在GNIIT课程中有关的Linux学习单元,其主要目的就是使学生了解Linux Shell,以便能够理解并实现模块中的项目所要求的远程连接到服务器进行用户权限管理,因此该单元涉及到大量的在Linux下进行系统管理的命令,使用命令行进行管理是Linux系统的特点,但这对于习惯了Windows的学生来说,是比较难适应的,原因有二,一是它改变了只需点击鼠标即可完成复杂功能的操作习惯,二是命令行方式下每条命令及其选项、参数的记忆确实让人头疼。因此找到一个能提高学生学习兴趣和学习效果的方法就显得非常重要。

孤立地学习和记忆每一条命令经常会令学生前学后忘,无法把所学的命令融会贯通,以致产生厌学、弃学的思想。针对于此,如果能够设计出一个解决基于实际问题的算法,编写出程序,把前后所学的命令串联起来,无疑会提高学生对所学命令的掌握,同时这也是GNIIT教学一直倡导的“学以致用”。

实现上述想法,可以利用Linux Shell编程。

二、相关知识

用户登录进入Linux系统时,可以进入基于X Window的图形视窗系统GDE完成很多工作,但是在服务器应用环境下的很多情况需要远程连接到服务器进行管理配置,而且使用命令行模式进行管理更加方便和简单,因此学习Linux,Shell的学习和使用是必不可少的一部分。

如果系统设置为不自动启动图形接口,那么用户登录时,实际进入了Shell①。Shell是什么呢?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

当用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和Shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字串。Shell解释用户输入的命令,就像DOS里的command.com一样②。

作为命令语言互动式地解释和执行用户输入的命令只是Shell功能的一个方面,Shell还可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的程序控制结构。使用Shell编程类似于DOS中的批处理文件,称为Shell script,又叫Shell程序或Shell命令文件。

三、一个Shell编程实例

Shell程序的设计,应该尽可能多地应用所学命令,同时还要兼顾学生的接受程度。来看下面这个问题。

1、问题

已将某班级学生某门课程考试成绩存储在score文件中。该文件的示例数据如下:

01 ZHANG 82

02 WANG 91

03 LI 76

......

在此文件中,字段定界符是‘ ’(空格)。不同的字段是学号,姓名,成绩。要求编写一个shell脚本,能够显示出成绩最高的学生的学号、姓名和成绩。例如:

The highest of the score is 91

2、题目设计目标

编写一个Shell程序解决这个问题,需要运用到以下命令:

1)vi编辑器创建和编辑文档

2)创建和执行脚本;

3)标准输入与输出以及重定向;

4)grep和cut过滤器的特性和选项;

5)用管道结合多个命令;

6)创建变量;

7)计算表达式;

8)使用if构造执行基于条件的shell脚本;

9)用于执行重复任务的构造(while、for或until构造);

10)使用echo命令显示消息。

以上部分几乎涵盖了教材中所介绍的全部命令。当然,有些部分,比如上面所列的“创建变量”和“计算表达式”有多种方法和命令形式,取决于个人的喜好,同样,对于用于执行重复任务的构造(while、for或until构造),也由编写习惯决定。

3、问题分析

这是一个典型的求最大值/最小值问题。对于已经学习过1-2门程序设计语言课程的学生来说,不难理解如下算法:

结果变量y赋初值;

循环体

x=当前记录值

分支结构(x和y比较)

y中的值即所求结果

对于该算法,需要解决的问题包括:

1)初值。求最大值问题时,赋给变量y的初值为问题解域中的最小值。对于该题,问题解的集合为[0,100],因此初值赋为0。

2)循环体。这里采用for构造。Shell程序中for语句的用法为for(表达式1; 表达式2; 表达式3)

表达式1:起始比较位置。i=1

表达式2:循环结束判断。i≤记录数,而记录数可由表达式

j=$(grep -c ' ' score)

求得,因此表达式2即可写成

i<=$j

表达式3:增量。i=i+1

3)分支结构。对于求最大值问题,

if 当前记录值>y

then y=当前记录值

fi

4、该题的难点——如何定位“当前记录”

本题“数据库”中的“字段”分别是学号(“数字”)、姓名(“字母串”)和成绩(“数字”)。如果在典型的关系数据库系统中只需要把该“数据表”中的“学号”作为关键字即可定位记录,但是Shell命令中没有直接用于定位当前记录的命令,只能使用过滤器(通常是用管道结合多个过滤器命令)来找出每个记录区别于其他记录的个体特征,即“关键字段”。而使用过滤器命令不能只把学号作为“关键字段”。试考虑如下记录段

01 ZHANG 82

02 WANG 91

03 LI 76

用grep “1”是无法区分出数据库中的第1和第2条记录的。这时可以采取把“学号+姓名”作为关键字的办法,具体做法是通过cut命令过滤出score文件中的第一和第二列,存放到另一个文件match中。

cut -d ' ' -f1,2 match

此时,match文件的内容为:

01 ZHANG

02 WANG

03 LI

在循环体中,当每次取欲比较的成绩值时,先从match文件中提取匹配项:

m=$(grep $i match)

然后通过m唯一定位“当前记录”来提取“成绩”:

x=$(grep “$m”

5、完整的脚本(为便于讨论,加注了行号)

01:j=$(grep -c ' ' score)

02:cut -d ' ' -f1,2 match

03:max=0

04:for((i=1;i<=$j;i=i+1))

05:do

06:m=$(grep $i match)

07:x=$(grep –m 1 “$m”

08:if [ $max -lt $x ]

09:then max=$x

10:fi

11:done

12:echo “The highest of the score is:$max”

6、设计评价

该程序的设计初衷就是通过接近真实问题的解决,让学生有效地掌握Linux命令,从这点看,本例达到了目的,因为程序中用到了教材中要求掌握的几乎所有命令(详见3.2)。另外,过滤器和管道命令是Linux Shell编程的特色,本例通过数据库编程中不可回避的记录定位问题,充分展示了如何巧用过滤器和管道命令。还有一点,因为本例应用于教学,所以对于学生的接受程度作了充分考虑,实践证明效果良好,教师可通过一节课深入剖析设计思路和程序语法,在学生完全理解解题思路与实现后,在第二节课可以将程序设计引向深入,比如,可让学生考虑一下实现:

(1)能否实现同時显示最高分的学生学号、姓名和成绩?

(2)在(1)的基础上,能否实现并列第一的多个学生的信息显示?

由于这两个问题的实现并不十分困难,这里就不再展开讨论了。当然,也正是出于初衷,本例的数据库结构设计贴近Linux Shell编程需要,而没有顾及实际数据库设计的原则,要求“学号必须严格按+1连续递增”,这个问题的根本解决需要对“学号”字段进行设计,这已超出了本文的讨论范围。

四、总结

通过编写Shell程序来掌握命令,关键是构造好的教学用例,好的教学用例应该能够涵盖学生所学的知识,提高学习兴趣,有利于学生对所学知识的掌握。这就要求任课教师必须充分理解教材中每一条命令,包括其中的每一个选项及参数的用法,同时要有宽广的知识面,唯有如此,才能设计出在学生接纳程度之内,帮助学生有效掌握Linux命令的适用程序。

注释:

①如果系统设置为自动启动图形系统,那么可以通过运行终端仿真程序,进入Shell,在命令提示符后面输入任何命令及参数。

②不同的是,在DOS中,command.com只有一个,而在Linux下比较流行的Shell有好几个,每个Shell都各有千秋。一般的Linux系统都将bash作为默认的Shell。

参考文献:

注:本文为网友上传,旨在传播知识,不代表本站观点,与本站立场无关。若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:66553826@qq.com

上一篇:linux系统移植 下一篇:在Linux中如何恢复被删除的文件