AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 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

Iterar a instrução if else até que uma condição seja bem-sucedida

  • 772

Eu escrevi um bloco de código abaixo

#!/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 $?

No meu script, inicialmente estou chamando a função FIELD_VALUES_1SQ_FUNCpara gerar um número de sequência.

Em segundo lugar, estou chamando RT_FIELD_IDS_FUNC ${TABLE_NAME} ${COL_NAME}onde obterá algum valor.

Terceiro, a função RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}é chamada, onde ela verifica se o valor está lá no banco de dados. Se o valor estiver lá, devo chamar o FIELD_VALUES_1SQ_FUNC()novamente para gerar um novo valor de sequência e verificá-lo com RT_SEQ_CHECK_FUNC ${FIELD_VALUES_1SQ} ${RT_FIELD_ID}a função, a menos que o valor não seja encontrado para esse select na FIELD_VALUES_1SQ_FUNC()função.

Alguma ideia de como isso pode ser alcançado!

linux bash
  • 1 1 respostas
  • 150 Views

1 respostas

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

    O que você está procurando é chamado de whileloop. Considere este exemplo simples:

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

    Um loop while faz duas coisas e, por implicação, o programador deve fazer uma terceira coisa.

    1. O laço while testa a condição: é nmenor que 5?
    2. Se a condição for verdadeira, então:

      • o corpo do whileloop é executado uma vez
      • o whileloop volta ao passo 1 e testa a condição novamente

    Se a condição não for verdadeira, o loop termina e a execução do script continua com a instrução que segue a palavra- donechave do loop.

    A terceira coisa, que é de responsabilidade do programador, é fazer algo dentro do corpo do loop que irá (ou poderá) alterar o status da expressão condicional. No exemplo simples acima, essa etapa é a n = $(($n+1))instrução. Sem isso, o loop se tornará infinito porque a condição é inicialmente verdadeira e nunca muda. Tente executar o script com essa linha comentada e veja o que acontece. Em seguida, pressione CtrlC.

    Para adaptar este exemplo ao seu problema específico, acho que você deve negar o teste [ -z "${RT_SEQ_CHECK}" ]para sua whilecondição. Com isso, quero dizer que quando [ -z "${RT_SEQ_CHECK}" ]for true, isso significa que ${RT_SEQ_CHECK}é comprimento zero, e é quando você deseja parar de fazer o loop. Felizmente testtem a -nopção que é exatamente o oposto da -zopção.

    Então, em termos muito amplos, seu whileloop ficará assim:

    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
    

    Finalmente, tenho o que espero que seja um comentário construtivo sobre a estrutura do seu código. Você tende a usar variáveis ​​globais para retornar um valor de uma função e, em seguida, refere-se a essas variáveis ​​globais no corpo principal do seu código. Isso pode tornar o código difícil de ler e seguir. Em vez de codificar neste estilo:

    STEP1() {
      DATE=$(date)
    }
    
    STEP2() {
      echo "today is $DATE"
    }
    
    STEP1
    STEP2
    

    Tente isto:

    STEP1() {
      date
    }
    
    STEP2() {
      echo "today is $1"
    }
    
    DATE="$(STEP1)"
    STEP2 "$DATE"
    

    Novamente, aplicar esse código pode resultar em algo assim:

    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

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve