shell 是 Unix 环境下的主要编程工具之一,一般来说,可以用shell解决的问题就用shell,不行就用awk再不行才用C。而且 shell 是脚本文件,一般来说在不同品牌的 Unix 中都可以运行,不象C要重新编译,可见 shell 是 Unix 系统管理及编程的重要工具。 不过 shell 中虽然可以自定义函数,但不能象C那样通过 include 语句引用其他文件中函数库,因此代码可读性较差,往往只是为了取出系统上一天的日期,需要在 shell 脚本文件中附上长长的代码。
以下提供一个工具,安装非常简单,只需要将GETools.tar解到$HOME目录下,如:tar xvf $HOME/GETools.tar $HOME/GETools,然后修改.profile,在PATH环境变量加上:$HOME/GETools。
工具下载:http://www.greatengine.com/Download/GETools.tar
以下是示范代码:
#字符串处理脚本[Demo1.sh]#GetStr.sh 从源字符串中截取开始串及结束串包围的部分#InStr.sh 返回子字符串在源字符串中出现的位置#LCase.sh 将字符串转换成小写#Left.sh 从左截取字符串的一部分 #Len.sh 返回字符串的长度#Mid.sh 截取字符串的一部分#Right.sh 从右截取字符串的一部分#String.sh 返回N个重复字符串#UCase.sh 将字符串转换成大写
clearStr="Hello The World"echo "设置字符串变量/nStr="$Str
StrRet=`GetStr.sh "$Str" "Hello" "World"`echo "/n执行[从源字符串中截取开始串及结束串包围的部分]/nGetStr.sh /"$Str/" /"Hello/" /"World/""echo "显示"$StrRet
StrRet=`InStr.sh "$Str" "The"`echo "/n执行[返回子字符串在源字符串中出现的位置]/nInStr.sh /"$Str/" /"The/""echo "显示"$StrRet
StrRet=`LCase.sh "$Str"`echo "/n执行[将字符串转换成小写]/nLCase.sh /"$Str/""echo "显示"$StrRet
StrRet=`Left.sh "$Str" "3"`echo "/n执行[从左截取字符串的一部分]/nLeft.sh /"$Str/" /"3/""echo "显示"$StrRet
StrRet=`Len.sh "$Str"`echo "/n执行[返回字符串的长度]/nLen.sh /"$Str/""echo "显示"$StrRet
StrRet=`Mid.sh "$Str" "4" "6"`echo "/n执行[截取字符串的一部分]/nMid.sh /"$Str/" /"4/" /"6/""echo "显示"$StrRet
StrRet=`Right.sh "$Str" "5"`echo "/n执行[从右截取字符串的一部分]/nRight.sh /"$Str/" /"5/""echo "显示"$StrRet
StrRet=`String.sh "20" "*"`echo "/n执行[返回N个重复字符串]/nString.sh /"20/" /"*/""echo "显示"$StrRet
StrRet=`UCase.sh "$Str"`echo "/n执行[将字符串转换成大写]/nUCase.sh /"$Str/""echo "显示"$StrRet
#辅助类脚本[Demo2.sh]#GetTmpName.sh 返回一个唯一的文件名#OptLogInf.sh 打印操作日志
StrRet=`GetTmpName.sh`echo "/n执行[返回一个唯一的文件名]/nGetTmpName.sh"echo "显示"$StrRet
LogFile="/tmp/GETools.log"echo "/n设置日志文件变量/nLogFile="$LogFileOptLogInf.sh $LogFile "abc"echo "打印日志/"abc/"到$LogFile并回显"cat $LogFilerm -f $LogFile
#日期类脚本[Demo3.sh]#GetNow.sh 返回当前时间#GetToday.sh 返回当前日期#IfxGetDateAdd.sh 返回指定日期的偏移日期#IfxGetTodayAdd.sh 返回当天的偏移日期
clearStrRet=`GetNow.sh`echo "/n执行[返回当前时间]/nGetNow.sh"echo "显示"$StrRet
StrRet=`GetNow.sh "-"`echo "/n执行[返回当前时间]/nGetNow.sh /"-/""echo "显示"$StrRet
StrRet=`GetToday.sh`echo "/n执行[返回当前日期]/nGetToday.sh"echo "显示"$StrRet
StrRet=`GetToday.sh "/"`echo "/n执行[返回当前日期]/nGetToday.sh /"//""echo "显示"$StrRet
StrRet=`IfxGetDateAdd.sh "-1" "2006-3-1"`echo "/n执行[返回指定日期的偏移日期]/nIfxGetDateAdd.sh /"-1/" /"2006-3-1/""echo "显示"$StrRet
StrRet=`IfxGetDateAdd.sh "-2" "2006-3-1" "-"`echo "/n执行[返回指定日期的偏移日期]/nIfxGetDateAdd.sh /"-2/" /"2006-3-1/" /"-/""echo "显示"$StrRet
StrRet=`IfxGetTodayAdd.sh "-1"`echo "/n执行[返回当天的偏移日期]/IfxGetTodayAdd.sh /"-1/" /"2006-3-1/""echo "显示"$StrRet
StrRet=`IfxGetTodayAdd.sh "-2" "-"`echo "/n执行[返回当天的偏移日期]/nIfxGetTodayAdd.sh /"-2/" /"-/""echo "显示"$StrRet
#[Demo4.sh]#一般来讲,在shell dbaccess代码段中不能象存储过程中那样使用判断语句,因此只能顺#序执行#以下示例通过调用IfxSQLGet.sh实现在Shell中调用 dbaccess 也可以使用判断语句,则时#调用 OptLogInf.sh 记录操作日志
LogFile=./Demo4.logOutFile=./Demo4.txtDB="gdcall"SQL="select count(*) from systables where tabname='tabtest'"Tabs=`IfxSQLGet.sh "$DB" "$SQL"`
OptLogInf.sh "$LogFile" "[Demo4.sh示例开始]/n/n"#注意,在 dbaccess 代码段中的!不能缩进if [ $Tabs -eq 0 ]then #表未创建 dbaccess $DB 1>>$LogFile 2>>$LogFile <<!!OptLogInf.sh "$LogFile" "未创建表,现在创建..." create table tabtest ( f1 int, f2 char(10) );!OptLogInf.sh "$LogFile" "创建表完毕"!
else #表已创建
dbaccess $DB 1>>$LogFile 2>>$LogFile <<!!OptLogInf.sh "$LogFile" "表已创建,删除数据..." delete from tabtest;!OptLogInf.sh "$LogFile" "删除数据完毕"!fi
dbaccess $DB 1>>$LogFile 2>>$LogFile <<!!OptLogInf.sh "$LogFile" "插入数据..." insert into tabtest(f1,f2) values(1,'aaa'); insert into tabtest(f1,f2) values(2,'bbb'); insert into tabtest(f1,f2) values(3,'ccc');!OptLogInf.sh "$LogFile" "导出数据到[$OutFile]..." unload to $OutFile select * from tabtest;!OptLogInf.sh "$LogFile" "导出结束"!
OptLogInf.sh "$LogFile" "[Demo4.sh示例结束]/n/n"
