AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 529262
Accepted
sabarish jackson
sabarish jackson
Asked: 2019-07-10 11:32:09 +0800 CST2019-07-10 11:32:09 +0800 CST 2019-07-10 11:32:09 +0800 CST

迭代 if else 语句直到条件成功

  • 772

我写了下面的代码块

#!/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()值。

关于如何实现这一点的任何想法!

linux bash
  • 1 1 个回答
  • 150 Views

1 个回答

  • Voted
  1. Best Answer
    Jim L.
    2019-07-10T12:13:36+08:002019-07-10T12:13:36+08:00

    您要查找的内容称为while循环。考虑这个简单的例子:

    n=0
    while [ $n -lt 5 ]; do
      echo Not done yet
      n=$(($n+1))
    done
    

    while 循环做两件事,暗示程序员必须做第三件事。

    1. while 循环测试条件:n小于 5?
    2. 如果条件为真,则:

      • 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})"
    
    • 1

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 通过标签将根文件系统传递给linux内核

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve