仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 529|回复: 8
打印 上一主题 下一主题

[其他Linux] CentOS教程之Linux Shell 编程实战技能

[复制链接]
分手快乐 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-15 22:16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比查man文档快.特别适合英语不好。
  今朝,愈来愈多的企业使用会部署在Linux体系上的,而LinuxShell剧本能够极年夜地匡助我们完成这些使用的运维义务。这使得LinuxShell开辟妙技成为开辟职员的一项主要的、有合作力的妙技。本文就笔者的实践开辟履历,以KornShell为例分享了剧本开辟中的罕见成绩及相干技能。



 制止准时义务剧本的罕见成绩

  良多剧本在实践利用的时分常常是以准时义务的体例运转,而非手工运转。可是完成一样功效的剧本在这两种运转体例下大概碰到的成绩不尽不异。
  以准时义务体例运转的剧本常常会碰到以下几个成绩。


  • 路径成绩:以后目次常常不是剧本文件地点目次。因而,剧本在援用其利用的内部文件,如设置文件和别的剧本文件时,没法便利得利用绝对路径。
  • 命令找不到成绩:剧本中利用到的一些内部命令,在手工实行剧本的时分能够一般挪用。可是在准时义务下运转则大概呈现剧本剖析器找不到相干命令的成绩。
  • 剧本反复运转成绩:一次剧本的实行未停止,而下一次剧本的运转已入手下手。招致体系中有多个历程在同时运转统一个剧本。
  上面分享准时义务剧本开辟中上述几个罕见成绩的处置办法。
  路径成绩

 准时义务下以后路径常常不是剧本文件地点目次。因而我们必要用相对路径来援用。即先猎取剧本地点目次,然后以该目次为基本接纳相对路径的体例往援用剧本所需的内部文件。办法以下面代码所示。
  清单1.猎取剧本文件地点路径
  1. #!/usr/bin/kshecho"Currentpathis:`pwd`"scriptPath=`dirname$0`#猎取剧本地点路径echo"Thescriptislocatedat:$scriptPath"cat"$scriptPath/readme"#利用相对路径援用内部文件
复制代码
  将清单1中的剧本置于目次/opt/demo/scripts/auto-task下,并在cron中增加该剧本。准时义务运转输入以下。
  Currentpathis:/home/viscent
  Thescriptislocatedat:/opt/demo/scripts/auto-task
  命令找不到成绩

  准时义务下运转的剧本大概呈现剧本剖析器找不到相干命令的成绩。好比Oracle数据库中的sqlplus命令,剧本在挪用该命令时若没有特别处置则在准时义务下实行会使剧本剖析器没法找到这个命令,呈现以下所示的毛病提醒:
  sqlplus:commandnotfound
  这是由于剧本在准时义务下实行时剧本是由非登录式Shell来实行的,而且实行剧本的父Shell并不是Oracle用户的Shell。因而,此时Oracle用户的.profile文件并没有被挪用。故办理的办法是在剧本的开首增加以下代码:
  清单2.办理找不到内部命令成绩
  1. source/home/oracle/.profile
复制代码
  也就说,关于内部命令找不到的成绩,能够经由过程在剧本的开首加一个source用户的.profile文件的语句来办理。
  剧本反复运转成绩

  准时义务剧本的别的一个罕见成绩是剧本反复运转的成绩。好比,一个剧本被设置为每5分钟运转一次。若某一次该剧本的运转没法在5分钟内停止的话,准时义务服务仍旧会新启一个历程来实行该剧本。这时候就呈现了运转统一个剧本的多个历程。而这大概招致剧本功效杂乱。而且华侈了体系资本。制止剧本反复运转的办法一般有两种。一是在剧本实行时先反省体系是不是存在运转该剧本的别的历程。若存在,则停止以后剧本的运转。二是,剧本运转时反省体系中是不是存在别的历程运转该剧本。若存在,则停止谁人历程(此办法有必定风险,慎用!)。这两种办法均必要在剧本的开首反省体系是不是已存在运转以后剧本的历程,若存在如许的历程则猎取该历程的PID。示例代码以下清单3所示。
  清单3.避免剧本反复运转办法1
  1. #!/usr/bin/kshmain(){selfPID="$$"scriptFile="$0"typesetexistingPidexistingPid=`getExistingPIDs$selfPID"$scriptFile"`if[!-z"$existingPid"];thenecho"Thescriptalreadyrunning,exiting..."exit-1fidoItsTask}#猎取除自己历程之外别的运转以后剧本的历程的PIDgetExistingPIDs(){selfPID="$1"scriptFile="$2"ps-ef|grep"/usr/bin/ksh${scriptFile}"|grep-v"grep"|awk"{if($2!=$selfPID)print$2}"}doItsTask(){echo"Taskisnowbeingexecuted..."sleep20#就寝20s,以摹拟剧本在实行必要长工夫完成的义务}main$*
复制代码
  清单4.避免剧本反复运转办法2
  1. #!/usr/bin/kshmain(){selfPID="$$"scriptFile="$0"typesetexistingPidexistingPid=`getExistingPIDs$selfPID"$scriptFile"`if[!-z"$existingPid"];thenecho"Thescriptalreadyrunning,killingit..."kill-9"$existingPid"#此办法有必定风险,慎用!fidoItsTask}#猎取除自己历程之外别的运转以后剧本的历程的PIDgetExistingPIDs(){selfPID="$1"scriptFile="$2"ps-ef|grep"/usr/bin/ksh${scriptFile}"|grep-v"grep"|awk"{if($2!=$selfPID)print$2}"}doItsTask(){echo"Taskisnowbeingexecuted..."sleep20#就寝20s,以摹拟剧本在实行必要长工夫完成的义务}main$*
复制代码
 剧本调试技能

  固然Shell开辟的一个广泛成绩是调试坚苦,缺少无效的调试工具。可是,我们能够接纳一些可以必定水平上匡助我们躲避调试坚苦的开辟与调试的体例。因为是剧本开辟,很多人习气于从间接地一行行地写代码,一个剧本内里乃至于一个函数都没有。固然这类体例在语法上和功效上并没有成绩。但这增添了调试的难度。相反,假如接纳模块化的体例往编写剧本,则使代码布局明晰、便于调试。这点,能够看如许一个例子。
  假定上面的剧本的功效是搜集临盆情况中的相干日记文件,用于定位成绩。必要搜集的日记文件包含操纵体系日记、两头件日记和使用体系自己的日记。这些文件会被紧缩成一个gz文件。
  清单5.主动搜集日记文件
  1. #!/usr/bin/kshmain(){collectSyslog#搜集体系日记文件collectMiddlewareLog#搜集两头件日记文件collectAppLog#搜集使用体系日记文件tar-zcflogs.tgzsyslog.zipmdwlog.zipapplog.zip#将三中范例的日记打包,便利下载}
复制代码
  若剧本实行报以下毛病:
  tar:applog.zip:Cannotstat:Nosuchfileordirectory
  我们能够很快锁定collectAppLog这个函数。由于它卖力输入applog.zip这个文件。而没有需要看代码中的别的部分。
  接纳模块化的体例的另外一个优点是代码调试的了局能够牢固上去。好比下面的例子中,假如你已调试好了操纵形态日记搜集的函数。接上去调试别的函数的时分,这些被调试的代码只管大概必要修改。可是这些修改影响到之前已调试好的代码的大概其实不年夜。相反,如果一个剧本中通篇都是语句,而不带函数,则修改个中一行代码,搜集三种日记的功效大概都受影响。
  别的一个典范的场景是剧本编写过程当中,我们大概会由于不太断定一些成绩怎样处置而写一些实验性的代码。然后,经由过程重复的调试往确认准确的处置体例。而现实上这些实验性的代码大概就是一条语句乃至一个命令。但很多人是在年夜段的代码中重复往调试这一小段代码。这将十分耗工夫。特别是调试过程当中代码中的别的部分调试时呈现毛病时,作者还得先办理别的毛病,不然大概会时我们真正要调试的代码没法被实行到。这类情况下,专门写一个测试性的小剧本。
  在该剧本中调试还我们不太断定该怎样写的代码,怎样将其”集成”到我们正在开辟的剧本中。如许能够进步调试效力,制止损耗本不应损耗的工夫。例如说,我们在编写过程当中必要猎取剧本自己地点历程的历程ID。而此时我们又不太断定这个猎取以后历程id的代码该怎样写。那末,我们能够新建一个测试性的剧本在个中实验完成这个猎取历程ID的功效。找到准确的办法后,将代码“移植”到我们真正要开辟的剧本中。
 处置年夜段字符输入

  剧本开辟中常常要处置的一个成绩是输入提醒信息。固然,关于冗长的提醒信息输入,利用echo命令就充足了。可是,关于年夜段的提醒信息输入仍旧利用echo命令处置则显得不敷文雅。一种更合适的办法是利用cat命令分离输出重定向。上面经由过程一个详细例子来讲明这点。
  假定上面的剧本会将某个程序安装到用户指定的目次下。若用户指定的目次不存在,则提醒
  用户反省指定的目次是不是准确,偏重新实行剧本。
  清单6.利用echo命令输入年夜段字符
  1. #!/usr/bin/kshpath="$1"if[!-d"$path"];then#这里还必须处置星号这个特别字符的显现echo****************************************************echoERRORecho"Thedestinationdirectorynotexists,makesurebelowdirectoryyouspecifiediscorrect:"echo${path}echo"Thenre-runthisscript."echo****************************************************fi
复制代码
  这类体例的代码可读性不是很好,浏览者必要浏览多个echo命令然后再举行”综合”才干正确了解提醒信息是甚么。别的,一旦提醒信息必要修改。这类修改大概由于修改个中一个echo命令时不当心多了一个双引号等特别字符而引发语法毛病,从而影响了全部剧本的实行。
  清单7的代码则展现了怎样利用cat命令和输出重定一直更好地处置年夜段文本的输入。
  清单7.利用cat命令输入年夜段字符
  1. #!/usr/bin/kshpath="$1"if[!-d"$path"];thencat<<EOF****************************************************ERRORThedestinationdirectorynotexists,makesurebelowdirectoryyouspecifiediscorrect:${path}Thenre-runthisscript.****************************************************EOFfi
复制代码
  明显,这类处置体例的代码加倍简便,可读性更好。浏览者只必要看一条命令,就晓得提醒信息的详细内容。而且,若要修正提醒语,我们能够宁神地在两个文件停止符EOF之间的部分改。即使修正错了,也不会影响到代码中的别的部分。
 制止利用非需要的一时文件

  老手在编写Shell剧本时常常在不用要利用一时文件的情形下利用了一时文件。这不但增添了而外的代码编写事情量(用于处置创立、读取、和删除一时文件等),并且大概使剧本运转速率变慢(文件I/O究竟不是快的操纵)。
  上面的例子中假定有个剧本的功效是往以后目次下一切的.txt文件中增加以下一行文本:
  &ndash;Endoffilename&ndash;
  清单8.和清单9.中的代码分离显现了在不用要利用一时文件的情形下利用一时文件的代码和不必要利用一时文件的代码。
  清单8.在不用要利用一时文件的情形下利用一时文件
  1. #!/usr/bin/kshls-lt*.txt|awk{print$NF}>tmp#将命令输入重定向光临时文件tmpcattmptypesetfileNametypesetlastLinewhilereadfileName#逐行读取一时文件中的每行dolastLine=`tail-1"$fileName"`if[!"$lastLine"=="--Endof$fileName--"];thenecho"--Endof$fileName--">>$fileNamefidone<tmp#从一时文件举行输出重定向rmtmp#删除一时文件
复制代码
  清单9.不利用一时文件
  1. #!/usr/bin/kshtypesetfileNametypesetlastLineforfileNamein$(ls-lt*.txt|awk{print$NF})dolastLine=`tail-1"$fileName"`if[!"$lastLine"=="--Endof$fileName--"];thenecho"--Endof$fileName--">>$fileNamefidone
复制代码
 利用撑持FTP功效的编纂器

  假如你的开辟情况是在Windows操纵体系下,而测试则是经由过程终端软件(如Putty)在Linux长进行。这类情况下,很多开辟者习气于在终端软件上间接编纂剧本(如利用vi命令)。明显,这类体例编纂效力低下。而且,剧本开辟常常必要边修正边测试。即便是一个语法毛病,因为缺少工具的撑持,我们大概要经由过程运转剧本才干发明。因而,进步剧本编纂效力某种水平上便进步了开辟效力。在Windows体系上开辟剧本时进步剧本编纂效力的一个不错的选择是利用撑持复杂的FTP功效的编纂器,如Editplus和UltraEditor。可使用这些编纂器以FTP的体例“翻开”(实践上就是下载)Linux测试主机上的剧本文件。编纂好剧本后对剧本举行保留时,这些编纂器会主动将剧本上传到测试主机上。接上去只需经由过程终端软件对剧本举行测试。假如测试后剧本必要持续修正,则能够使用编纂器的“从头载进文档”的功效(一般能够为该功效设置快速键)。
vim除非你打算真正的学好linux,或者说打算长久时间学习他,而且肯花大量时间vim,否则,最好别碰
柔情似水 该用户已被删除
沙发
发表于 2015-1-17 17:24:15 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
第二个灵魂 该用户已被删除
板凳
发表于 2015-1-22 07:34:33 | 只看该作者
就这样,我们一边上OS理论课,一边上这个实验,这样挺互补的,老师讲课,一步一步地布置任务
海妖 该用户已被删除
地板
发表于 2015-1-30 23:45:38 | 只看该作者
Linux高手更具有鼓励新手的文化精神。如何在Linux社区获得帮助,需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问。
小女巫 该用户已被删除
5#
发表于 2015-2-6 17:28:39 | 只看该作者
在系统检测不到与Linux兼容的显卡,那么此次安装就可能不支持图形化界面安装,而只能用文本模式安装等等。
飘灵儿 该用户已被删除
6#
发表于 2015-2-17 21:30:21 | 只看该作者
笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机
爱飞 该用户已被删除
7#
发表于 2015-3-5 23:30:23 | 只看该作者
另外Linux上也有很多的应用软件,安装运行了这些软件后,你就可以在Linux上编辑文档、图?片,玩游戏、上网、播放多媒体文件等。
透明 该用户已被删除
8#
发表于 2015-3-12 16:37:40 | 只看该作者
Linux是参照Unix思想设计的,理解掌握Linux必须按照Unix思维来进行。思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度。
只想知道 该用户已被删除
9#
发表于 2015-3-20 00:48:50 | 只看该作者
清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表