Como posso testar se uma variável corresponde a outro valor e passar para outra função?

3

Estou escrevendo um script onde armazeno uma linha de texto predeterminada em uma string (chamaremos abc ). Estou armazenando os resultados de grep -iqs $USER file (chamaremos def ) em outra sequência.

Como posso testar se $abc corresponde ao conteúdo em $def e, se o fizer, passar para a próxima função? Se isso não acontecer, solicite a entrada do usuário.

Esta é minha tentativa até agora:

firstFunction() {
abc="$USER content";               #text stored as string
def='grep -iqs $USER /file';       #results of grep stored to string
if [[ $def = "$abc" ]]; then       #test if result from grep command matches text in
   secondFunction                  #string $def. If true, move to secondFunction. If
else                               #false, prompt user.
   echo "Message to user with a y/n prompt"; read prmt;
fi;
if [[ $prmt != "y" || $prmt != "n" ]]; then prmt
elif [[ $prmt == "y" ]]; then
   sed -i "s/$def/$abc/g" /file    #If user chooses y at prompt, replace $abc with $def
elif [[ $answer == "n" ]]; then    #in file. If user chooses no at prompt, move to 
   secondFunction                  #secondFunction.
fi;
clear;
};

Os títulos de ambiente foram alterados, mas o conceito por trás do trecho deve ser claro.

    
por Kevin Wyman 30.12.2012 / 20:33

1 resposta

2

Primeiro de tudo, porque você usou grep com -q argumento, o valor da variável def sempre será igual a uma string vazia. De man grep :

% bl0ck_qu0te%

Segundo , você deve pensar um pouco na lógica. Esta expressão:

$prmt != "y" || $prmt != "n"

está sempre em qualquer linguagem de programação avaliada como true :

  • se $prmt = "y" , então com certeza $prmt != "n" , então sua expressão é true
  • se $prmt = "n" , então com certeza $prmt != "y" , então sua expressão é true
  • em outros casos, é claro que sua expressão é verdadeira.

Terceiro , sua função deve se parecer com:

firstFunction() {
    abc="$USER content"
    def='grep -is $USER /path/to/file'
    if [[ $def = "$abc" ]]; then
       secondFunction 
       return                            #does not make sense to go ahead
    else
       echo "Message to user with a y/n prompt"
       read prmt
    fi
    while : ; do
    if [  "$prmt" = "n" ]; then 
       secondFunction
       return                            #does not make sense to go ahead
    elif [ "$prmt" = "y" ]; then
       sed -i "s/$def/$abc/g" /path/to/file
       return                            #does not make sense to go ahead
    else
       echo "Message to user with a y/n prompt"
       read prmt
    fi
    done
}

Ou, como você disse, você pode usar a declaração case .

Veja também:

por Radu Rădeanu 20.09.2013 / 09:43