我写了下面的代码块
#!/bin/bash
TABLE_NAME="${1}"
COL_NAME="${2}"
FIELD_VALUES_1SQ_FUNC()
{
FIELD_VALUES_1SQS=`sqlplus -s sab/admin@TERM << EOF
SET FEEDBACK OFF;
SET HEADING OFF;
Select TESTING.FIELD_VALUES_TEMP_1SQ.NEXTVAL from dual;
exit;
EOF`
FIELD_VALUES_1SQ=`echo ${FIELD_VALUES_1SQS} | tr -d ' '`
}
RT_SEQ_CHECK_FUNC()
{
RT_SEQ_CHECKS=`sqlplus -s sab/admin@TERM << EOF
SET FEEDBACK OFF;
SET HEADING OFF;
Select * from TESTING.FIELD_VALUES where FIELD_ROW_ID='${1}' and TF_ID='${2}';
exit;
EOF`
RT_SEQ_CHECK=`echo ${RT_SEQ_CHECKS} | tr -d ' '`
}
RT_FIELD_IDS_FUNC()
{
RT_FIELD_IDS=`sqlplus -s sab/admin@TERM << EOF
SET HEADING OFF;
SET FEEDBACK OFF;
select max(TF_ID) from TESTING.TABLE_FIELD where field_id in(select field_id from TESTING.FIELD_DOMAIN where name='${2}') and table_id in (select table_id from TESTING.TABLE where name='${1}');
EXIT;
EOF`
RT_FIELD_ID=`echo ${RT_FIELD_IDS} | tr -d ' '`
}
FIELD_VALUES_1SQ_FUNC
RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
if [ -z "${RT_SEQ_CHECK}" ]
then
echo "Sequence values doesn't exist |--${RT_SEQ_CHECK}--|"
else
echo "SEQUNCE VAlue exists |--${RT_SEQ_CHECK}--|"
fi
echo "TF_ID=${FIELD_VALUES_1SQ}"
echo "FIELD_ROW_ID=${RT_FIELD_ID}"
exit $?
在我的脚本中,首先我调用该函数FIELD_VALUES_1SQ_FUNC
来生成序列号。
其次,我打电话RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
给它会得到一些价值。
第三,RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
调用该函数,检查该值是否存在于数据库中。如果该值存在,那么我应该FIELD_VALUES_1SQ_FUNC()
再次调用以生成新的序列值并使用函数检查它,除非在函数RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
中找不到该选择的值。FIELD_VALUES_1SQ_FUNC()
关于如何实现这一目标的任何想法!
答案1
您正在寻找的称为while
循环。考虑这个简单的例子:
n=0
while [ $n -lt 5 ]; do
echo Not done yet
n=$(($n+1))
done
while 循环做了两件事,并且暗示程序员必须做第三件事。
- while 循环测试条件:
n
小于 5? 如果条件为真,则:
- 循环体
while
执行一次 - 循环
while
返回步骤 1 并再次测试条件
- 循环体
如果条件不为真,则循环终止,脚本继续执行done
循环关键字后面的语句。
第三件事,即程序员的责任,是在循环体内执行一些操作,这将(或可能)更改条件表达式的状态。在上面的简单示例中,该步骤就是n = $(($n+1))
语句。如果没有这个,循环将变得无限,因为条件最初为真并且永远不会改变。尝试运行注释掉该行的脚本,看看会发生什么。然后按CtrlC。
为了根据您的具体问题定制此示例,我认为您需要根据[ -z "${RT_SEQ_CHECK}" ]
您的while
情况否定测试。我的意思是,当[ -z "${RT_SEQ_CHECK}" ]
为真时,这意味着${RT_SEQ_CHECK}
长度为零,而这就是您想要的时候停止循环播放。幸运的是,test
有一个-n
与该选项完全相反的选项-z
。
因此,从广义上讲,您的while
循环大致如下所示:
FIELD_VALUES_1SQ_FUNC
RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
while [ -n "${RT_SEQ_CHECK}" ]; do
FIELD_VALUES_1SQ_FUNC
RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}
RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}
done
最后,我希望对您的代码结构提出建设性的评论。您倾向于使用全局变量从函数返回值,然后在代码主体中引用这些全局变量。这可能会使代码难以阅读和遵循。而不是用这种风格编码:
STEP1() {
DATE=$(date)
}
STEP2() {
echo "today is $DATE"
}
STEP1
STEP2
尝试这个:
STEP1() {
date
}
STEP2() {
echo "today is $1"
}
DATE="$(STEP1)"
STEP2 "$DATE"
同样,应用您的代码可能会导致类似这样的结果:
FIELD_VALUES_1SQ_FUNC()
{
sqlplus -s sab/admin@TERM << EOF | tr -d ' '
SET FEEDBACK OFF;
SET HEADING OFF;
Select TESTING.FIELD_VALUES_TEMP_1SQ.NEXTVAL from dual;
exit;
EOF
}
RT_SEQ_CHECK_FUNC()
{
sqlplus -s sab/admin@TERM << EOF | tr -d ' '
SET FEEDBACK OFF;
SET HEADING OFF;
Select * from TESTING.FIELD_VALUES where FIELD_ROW_ID='${1}'
and TF_ID='${2}';
exit;
EOF
}
RT_FIELD_IDS_FUNC()
{
sqlplus -s sab/admin@TERM << EOF | tr -d ' '
SET HEADING OFF;
SET FEEDBACK OFF;
select max(TF_ID) from TESTING.TABLE_FIELD
where field_id in (select field_id from TESTING.FIELD_DOMAIN where name='${2}')
and table_id in (select table_id from TESTING.TABLE where name='${1}');
EXIT;
EOF
}
FIELD_VALUES_1SQ="$(FIELD_VALUES_1SQ_FUNC)"
RT_FIELD_ID="$(RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME})"
RT_SEQ_CHECK="$(RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID})"