欢迎来到天天文库
浏览记录
ID:41037357
大小:46.00 KB
页数:4页
时间:2019-08-14
《Shell编程经验总结之-编程习惯》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Shell编程经验总结之――――编程习惯在上篇Shell编程经验总结之-重定义和跨平台一文中提到的内容对于大型shell系统的构建,以及平台命令存在差异的问题都能很好的解决,同样也可以简单的实现多语言的支持,你一定想到了只要把语言信息定义成资源文件作为变量引入到系统中即可.如果你没有构建过大型系统对于以上好处你不一定能体会到J.好了,如果你开始因为我的影响慢慢改变,开始了习惯新的方法来组织你的shell脚本,那么你会遇到很多新的问题。现在我就从一些细小的地方讲述一下shell编程应该注意的一些习惯。首先,从脚本的入
2、口讲起.建议每个sh文件(即用户一般直接执行的)都有一个main()函数,然后在main函数里面统一写执行主体.然后再在shell中调用main函数.如下:#!/bin/bash################################################################################function:#input:#output:#return:###########################################################
3、####################main(){#根据需要进行参数处理get_my_log_allreturn$?}###############################################################################./home/away/common/tools.inccd${0%/*}#echo`pwd`main"$@"exit$?上述代码定义了一个main函数,然后引入我们需要的功能函数,存放在tools.inc中,这些都已经很熟悉了,接下来的内
4、容cd${0%/*}可能很多人没见过。干什么用的呢?如果你对shell还算熟悉的话,应该知道这是进入本脚步所在的目录,即把当前的工作目录设置成本脚本所在的目录。${}相关的知识可以通过manbash(随便找个shell都可以)查询到,下面我通过一些例子说明${}的一些特异功能:假设我们定义了一个路径变量为:file=/dir1/dir2/dir3/my.file.txt我们可以用${}分別替换获得不同的值:${file#*/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt${fi
5、le##*/}:拿掉最后一条/及其左边的字串:my.file.txt${file#*.}:拿掉第一个.及其左边的字串:file.txt${file##*.}:拿掉最后一个.及其左边的字串:txt${file%/*}:拿掉最后条/及其右边的字串:/dir1/dir2/dir3${file%%/*}:拿掉第一条/及其右边的字串:(空值)${file%.*}:拿掉最后一个.及其右边的字串:/dir1/dir2/dir3/my.file${file%%.*}:拿掉第一个.及其右边的字串:/dir1/dir2/dir3/my
6、简单来说就是两个#(或者%)表示最大匹配一个#(或者%)表示最小匹配#从左边开始匹配,%从右边开始匹配但是是找到匹配的被切掉.这样做有什么好处呢?第一,你始终能通过pwd准确的知道你脚本所在的绝对路径(如果系统中其他地方需要的话可以用全局变量保存起来)。第二可以避免一个因为工作目录的问题而导致你的系统不能正常运行的问题。举个简单的例子说明一下。你可能会有一个目录结构如下的系统:bin/test.shcfg/test.cfg一个可执行文件test.sh一个配置文件test.cfg,test.sh要用到此配置文件中的配
7、置信息。Test.sh的内容如下:#!/bin/bash#具体代码省略……#你因为不知道系统所在的绝对路径而使用相对路径访问配置文件。cat../cfg/test.cfg
8、grep……#后面进行一些其他操作,都省略……上面的代码看起来是没什么问题,并且如果你平时都进入test.sh所在的bin目录执行次脚本你不会发现有任何问题。但是有一天你心血来潮J,不想cd到bin目录执行此脚本。而是在bin所在的父目录执行bin/test.sh时,你就会惊讶,天哪,我的程序以前都运行的很好的,为什么现在不行了呢?你可能还在抱怨
9、谁动了我的奶酪J。其实是你自己没有好好构建这个系统。因为当前工作目录是bin的父目录,而cat../cfg/test.cfg当然不是你想要的那个文件了,一般是不会存在的,除非有巧合。再往下看程序main"$@"和exit$?。这个exit$?我相信大家都很清楚就不多说了(注:bash不支持在脚本中直接return,只能在函数中进行return,而ksh支持在
此文档下载收益归作者所有