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 将字符串转换成大写
clear
Str="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="$LogFile
OptLogInf.sh $LogFile "abc"
echo "打印日志/"abc/"到$LogFile并回显"
cat $LogFile
rm -f $LogFile
#日期类脚本[Demo3.sh]
#GetNow.sh 返回当前时间
#GetToday.sh 返回当前日期
#IfxGetDateAdd.sh 返回指定日期的偏移日期
#IfxGetTodayAdd.sh 返回当天的偏移日期
clear
StrRet=`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.log
OutFile=./Demo4.txt
DB="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"