shell脚本心得

零零星星的接触到写一些shell也有一些日子了,发现自己已经犯了不少的错误,自我总结下。

选择合适的shell

shell本身有很多种,大体有如下的几种。

/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 预设的 shell)
/bin/ksh (Kornshell 由 AT&T Bell lab. 发展出來的,相融于 bash)
/bin/tcsh (整合 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
/bin/zsh (基于 ksh 发展出來的,功能更強大的 shell)

可以根据工作的需要和自己的实际情况来选择,目前我使用比较多的就是bash,ksh

 

不同路径执行,不会影响结果

这个问题比较纠结,在自己写的一些脚本中,没有注意到一些路径的设置,可能在当前目录下执行脚本和在其他路径下执行就有很大的差别,甚至是严重的错误。

比如我现在有一个脚本test.sh在目录 /u01/ora11g下面。

那么我在/u01/ora11g下面执行自然没有问题,但是比如我现在在/u02/db2的目录下面,我想运行这个test.sh 可能就需要输入 ksh /u01/ora11g/test.sh xxxxx

如果路径的一些通用性没有考虑到的话,这个脚本很可能出错,或者出现不期望的结果。

 

临时文件的处理和命名

对于临时文件的处理,个人建议统一命名,比如以以下特定的操作,功能命名。

xxxx_rename_file.tmp等等。

 

命令的简化和功能的简化

对于这个部分,需要大家自己把握一个度,可能有些人喜欢用一个很“精简”的命令来完成一个很复杂的工作。有些人喜欢通过一些很简单的操作来组合起来,完成一个复杂的功能。

但是需要大家自己把握这个度,如果脚本的维护和后期的改进不是你一个人来完成的话,最好还是以一些规范为主,适当加入一些相关的注释和说明。有些精简的命令可以加一些特定的描述,这样在后期需要改进,就很容易把握。

 

适用的平台

如果大家在unix,linux下写过一些脚本,可能会发现有一些命令的选项在Linux可用,但是到了Unix下却并不买账。

比如awk,grep在SunOS,AIX,linux下对应的路径有很大的差别,如果想让命令更通用,可以考虑下面的形式。

if [ $MachineType = SunOS ]
then
    export AWK=/usr/xpg4/bin/awk
    export GREP=/usr/xpg4/bin/grep
    export SED=/usr/xpg4/bin/sed
    export TR=/usr/xpg4/bin/tr
    export RM=/usr/xpg4/bin/rm
    export CAT=/usr/bin/cat
    export MV=/usr/xpg4/bin/mv
    export CUT=/usr/bin/cut
    export WHOAMI=/usr/ucb/whoami
    export SORT=/usr/xpg4/bin/sort
    export CP=/usr/xpg4/bin/cp
elif [ $MachineType = AIX ]
then
    export AWK=/usr/bin/awk
    export GREP=/usr/local/bin/grep
    export SED=/usr/bin/sed
    export TR=/usr/bin/tr
    export RM=/usr/bin/rm
    export CAT=/usr/bin/cat
    export MV=/usr/bin/mv
    export CUT=/usr/bin/cut
    export WHOAMI=/usr/bin/whoami
    export SORT=/usr/bin/sort
    export CP=/usr/bin/cp
elif [ $MachineType = Linux ]
then
    export AWK=/bin/awk
    export GREP=/bin/grep
    export SED=/bin/sed
    export TR=/usr/bin/tr
    export RM=/bin/rm
    export CAT=/bin/cat
    export MV=/bin/mv
    export CUT=/bin/cut

。。。。。

日志

对于脚本中的数据,文件处理,最好还是有一些详尽的日志,没有日志,谁也不知道到底发生了什么。

而且对于问题的排查时极为重要的。

 

函数库

如果你已经沉淀了不少的功能集,可以考虑把他们整合到函数库中,在以后的处理中直接调用即可。

 

动态脚本

完成一些复杂的功能时,可以考虑使用动态脚本来实现。

可以考虑通过shell脚本来生成一些特定功能的shell脚本。

比如:使用动态变量进行动态数据比较

http://blog.itpub.net/23718752/viewspace-1210639/

 

完整的数据校验和容错处理

脚本的编写过程中,可能大家经常忽略的就是一些数据的校验功能,可能有很多细节都没有做校验,在复杂的场景中就很容易出错,如果要写一个比较完善的脚本,那么数据的校验和错误的处理都是需要格外关注的,毕竟软件的很多细节都是成败的关键。

 

强大的工具集 sed+awk

sed+awk在shell脚本的编写中有很重要的作用,使用的过程中正则表达式的一些知识也需要补补。

有很多的功能可能通过一些文件处理能够实现,但是有时候就很容易使用sed/awk来完成。

抛砖引用一下,比如我想对当前目录下的文件,输出文件名都添加一个后缀.abc 

可以这样来写

ls -l|awk ‘{print $9 “.abc”}’

 

交互性

可能在写脚本的时候,大家对于一些参数需要输入,就可以提供一些可读性的提示信息。这样在操作的时候更容易理解。

可以使用read来引入一些输入参数的值,加入一些提示信息。

cat test.sh

echo  'please input your message:'; read name
echo 'your message is :'$name

[ora11g@rac1 ~]$ ksh testa.sh
please input your message:
this is a test
your message is :this is a test

 

充分利用其他的工具的功能集

使用shell做数据的运算,和其他编程语言相比,感觉还是比较的吃力,比如我想做一个舍入的运算,在oracle中就是ceil()函数实现的功能。

使用一个简单的sql就马上得到期望的结果,。

SQL> select ceil(100/3) from dual;

CEIL(100/3)
-----------
         34

但是使用shell需要类似下面的一些转换和处理,当然了在文件的处理方面,shell的功能很强大。

pages_float=`echo "scale=2 ; 100 / 3 "|bc`
pages_num=`echo '' | awk -v a=$pages_float '{print int(a+0.999)}'`

echo $pages_num
34

时间: 2024-10-16 09:15:43

shell脚本心得的相关文章

Shell脚本实现获取网页快照并生成缩略图_linux shell

获取网页快照并生成缩略图可分两步进行: 1.获取网页快照 2.生成缩略图 获取网页快照 这里我们用 phantomjs 来实现.关于 phantomjs 的详细用法可参考官方网站.http://phantomjs.org/ 1.安装 我的环境是CentOS6.5,安装时直接下载 tarball 然后解压即可. 复制代码 代码如下: # wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-i686.t

关于Shell脚本效率优化的一些个人想法_linux shell

一.先说一下Shell脚本语言自身的局限性 作为解释型的脚本语言,天生就有效率上边的缺陷.尽管它调用的其他命令可能效率上是不错的. Shell脚本程序的执行是顺序执行,而非并行执行的.这很大程度上浪费了可能能利用上的系统资源. Shell每执行一个命令就创建一个新的进程,如果脚本编写者没有这方面意识,编写脚本不当的话,是非常浪费系统资源的. 二.我们在Shell脚本语言的局限性上尽可能的通过我们有经验的编码来提高脚本的效率. 1.比如我想做一个循环处理数据,可能是简单的处理一下数据,这样会让人比

用来检测输入的选项$1是否在PATH中的shell脚本_linux shell

今天无意中发现一本挺有意思的shell编程的书,是e文的,内容是101个shell案例,坚持明天看一个,写点心得. 下面是例子001: #!/bin/sh # inpath - Verifies that a specified program is either valid as is, # or that it can be found in the PATH directory list. in_path() { # Given a command and the PATH, try to

怎么通过java去调用并执行shell脚本以及问题总结

该文章来自阿里巴巴技术协会(ATA)精选集 背景 我们在开发过程中,大部分是java开发, 而在文本处理过程中,主要就是脚本进行开发. java开发的特点就是我们可以很早地进行TDDL, METAQ 等等地对接: 而脚本开发的特点就是在进行批处理的时候非常方便. 前阵子我遇到这么一个需求场景: 对抓取的数据进行打包, 后来又遇到我要通过脚本进行抓取,比如nodejs下基于phantomjs的casperjs爬虫. 解决方法 对于第一个问题:java抓取,并且把结果打包.  那么比较直接的做法就是

怎么用shell脚本遍历数据库某个表,一个字段下的所有内容

问题描述 怎么用shell脚本遍历数据库某个表,一个字段下的所有内容 数据库为mysql 就是遍历一列上所有的内容,然后判断是否等于某个值,取出这个字段对应的其他字段的值. 解决方案 听你的意思应该就是: select * from 表名 where 列名=某个值; 解决方案二: 直接用sql语句来遍历判断条件查询数据好了

shell 自动重启nginx php shell脚本

shell 自动重启nginx php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

生产环境Shell脚本Ping监控主机是否存活(多种方法)

在网上针对shell脚本ping监控主机是否存活的文档很多,但大多都是ping一次就决定了状态,误报率会很高,为了精确判断,ping三次不通再发告警,只要一次ping通则正常.于是,今天中午抽出点时间总结了下面脚本. 脚本功能:通过Ping命令监控主机是否存活,如果ping失败则继续ping,三次不通就认为主机宕机或网络有问题,这时就可以发送邮件告警了. 方法1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash

将PHP作为Shell脚本语言使用

脚本 本文出自:http://phpuser.com 作者: y10k翻译 (2002-10-15 06:02:00) --英文原著:Darrell Brogdon,发表于 http://www.phpbuilder.com/columns/darrell20000319.php3) 可能很多人都想过使用PHP编写一些定时发信之类的程序,但是却没有办法定时执行PHP:一次去PHPBuilder的时候,发现了这一篇文章,于是想给大家翻译一下(同时做了一些修改),希望对大家有用.第一次翻译文章,不好

PHP教程之PHP中shell脚本的使用方法

我们都知道,在计算机科学中,SHELL类似于DOS下的command.com.它接收用户命令,然后调用相应的应用程序.同时它又是一种程序设计语言.作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支. PHP经过长时间的发展,很多用户都很了解PHP了,这里我发表一下个人理解,和大家讨论讨论.大多数情况下,我使用 exec() 命令和数据数组处理所有东西.或者对