#!/bin/sh if [ -n $1 ];then echo "" > /dev/null fi confFileName=$1 # DB接続情報の取得 confFile="/JOBSCHE/SHELLS/SK/CONTM/${confFileName}" userid=`grep '^userid' ${confFile} | cut -d= -f2` passwd=`grep '^passwd' ${confFile} | cut -d= -f2` constr=`grep '^constr' ${confFile} | cut -d= -f2` svaddr=`grep '^svaddr' ${confFile} | cut -d= -f2` port=`grep '^port' ${confFile} | cut -d= -f2` # DB接続テスト CLASSPATH="${ORACLE_HOME}/jdbc/lib/classes12.zip:/JOBSCHE/SHELLS/SK/CONTM" export CLASSPATH java connectTest ${svaddr} ${port} ${constr} ${userid} ${passwd} if [ $? -ne 0 ];then echo "${confFileName}の接続情報は無効です。ファイルの中身を確認してください。" exit 1 fi echo "${confFileName}の接続情報は有効です。"
解析:
1. #!/bin/sh
"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell.如果脚本被编写为在Kornshell ksh中运行,而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败。
#!行中的解释器的路径必须是全路径,exec函数并不对其特殊处理,比如用PATH变量来搜索它的真实路径,所以路径是由程序员来保证正确的。
当然不必了,通过上面的解释,其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本,比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等。
2. IF控制流程
"if" 表达式 如果条件为真则执行then后面的部分: if ....; then .... elif ....; then .... else .... fi 大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件 是否存在及是否可读等等… 通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。 [ -f "somefile" ] :判断是否是一个文件 [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限 [ -n "$var" ] :判断$var变量是否有值 [ "$a" = "$b" ] :判断$a和$b是否相等
3.变量
在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。 对变量赋值: confFileName=$1 使用变量的值:(用花括号) confFile="/JOBSCHE/SHELLS/SK/CONTM/${confFileName}"
4.从文件中取值:
userid=`grep '^userid' ${confFile} | cut -d= -f2` grep: 在文件内搜索字符串 例: grep 'dangdang' file.txt 在file.txt中搜索字符串“dangdang” ^: 匹配输入字符串的开始位置 cut: cut命令用于从文件或者标准输入中读取内容并截取每一行的特定部分并送到标准输出。 截取的方式有三种,一是按照字符位置,二是按照字节位置,三是使用一个分隔符将一行分割成多个field,并提取指定的fields。 cut命令有5个参数,其中-c,-b,-f分别表示"character", "byte"以及"field"截取方式。当采用field模式截取时,需要用"-d"参数指定一个分隔符,分割符只能为单个字符。另外还有一个"- s",suppress,表示如果行中没有给出的分割符则不输出该行(默认为如果没有分隔符则将该行原封不动输出) cut -d= -f2 经过上面的解释不难看出这句话的意思。以“=”号作为分隔符,取得分隔后的第二个字符。
5 export
shell,每个shell都是由某个shell(称为父shell)派生的。 在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程 序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。 例: $ cat >; shella #!/bin/sh aa = "abc" ^D $ cat >; shellb aa = "123" shella echo $aa ^D 运行shellb, 屏幕显示: 123 如果在shella的最底行加上一句 export aa 那么shellb的运行结果就是: abc
6.java connectTest ${svaddr} ${port} ${constr} ${userid} ${passwd}
调用JAVA程序,并传入5个参数
调用的connectTest.java的内容:
import java.sql.*; class connectTest{ public static void main(String[] args){ DataBaseAccessOra dbao = new DataBaseAccessOra(); int rtnCode = 0; rtnCode = dbao.connect(args[0]+":"+args[1]+":"+args[2],args[3],args[4]); if (rtnCode != 0) { System.exit(rtnCode); } dbao.disconnect(); } } class DataBaseAccessOra{ //DBへ接続するためのメソッド public Connection con = null; public int connect(String connstr,String username,String password){ try { //Oracle用のJDBCドライバをロード Class.forName("oracle.jdbc.driver.OracleDriver"); //Oracle接続文字列(JDBC) String ora_connect = "jdbc:oracle:thin:@"+connstr; //DBへ接続 con = DriverManager.getConnection(ora_connect, username, password); } catch (Exception ex) { return 1; } return 0; } //DBから切断するためのメソッド public void disconnect() { try { con.close(); } catch (SQLException ex) { ex.printStackTrace(); } } }
7.IF的解析
if [ $? -ne 0 ];then echo "${confFileName}の接続情報は無効です。ファイルの中身を確認してください。" exit 1 fi $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 -ne:不等于 echo:输出 解释: 如果前面调用 connectTest 的返回值不等于0,表示有错误。shell结束。