Como escrever o script bash enquanto usa o comando como condição na instrução if?

1

Estou escrevendo um script bash para processar entradas do formulário html. Eu tenho dois problemas que não consigo descobrir. Eu sou um iniciante no Unix.

O primeiro problema é que não consigo fazer com que minha instrução if funcione usando o comando como condição. Eu estou tentando verificar a entrada do usuário da inicial do meio e ajustá-lo para garantir que ele possa ser combinado em $ answer.

Aqui está um exemplo de como é suposto processá-lo.

O usuário insere três campos diferentes do formulário html; primeiro nome, inicial do meio, sobrenome.

Primeiro nome: George
Inicial do meio: W.
Último nome: Bush

O script shell processa e compara a entrada do usuário e a resposta real. Resposta real é "George W. Bush"

Entrada do usuário:
George W. Bush = correto eco "Você está correto!"
George W Bush = correto colocando automaticamente o período depois de "W"
George Bush! = Errado e eco "Sem inicial do meio!"
Geor W. Bus! = Errado e eco "O nome e sobrenome estão errados!"

#! /bin/bash
echo Content-type: "text/html"
echo ""

read input #name variable $first, $middle, $last name

first='user input'
middle='user input'
last='user input'

president='actual answer, full name of president'
answer='user answer, combination of $first, $middle, $last'

correctF='actual first name from $president'
correctM='actual middle initial from $president'
correctL='actual last name from $president'
#cut by column from $president

Primeiro problema começa aqui.

if [[ $(echo $middle | wc -l) = 1 ]] ; then
    middle='echo "$middle""."' 
    #check if middle initial variable was entered with just the letter and place a period after
elif [[ $(echo $middle | grep '.') = 'true' ]] ; then
    middle='echo "$middle"'
    #check if middle initial variable was entered with the period and leave it as is
else
    middle=''false''
    #no middle initial variable was entered and is null
fi

Segundo problema em while loop com a instrução if.

Estou tentando comparar a entrada do usuário $ answer à resposta real $ president e ecoar o que está errado com $ answer. Nada é ecoado para esta seção.

while [ "$president" -ne "$answer" ] #not working
    do
            if [ "$first" -ne "$correctF" ]
                    then
                            echo "Wrong first name!"
            elif [ "$middle" -ne "$correctM" ]
                    then
                            echo "Wrong middle initial!"
            elif [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong last name!"
            elif [ -z "$middle" -ne "$correctM" ]
                    then
                            echo "No middle initial!"
            elif [ "$first" -ne "$correctF" ] && [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong first and last name!"
            elif [ "$first" -ne "$correctF" ] && [ "$middle" -ne "$correctM" ]
                    then
                            echo "Wrong first name and middle initial!"
            elif [ "$middle" -ne "$correctM" ] && [ "$last" -ne "$correctL" ]
                    then
                            echo "Wrong middle initial and last name!"
            elif [ "$first" -ne "$correctF" ] && [ "$middle" -ne "$correctM"] && [ "$last" -ne "$correctL" ]
                    then
                            echo "You got it all wrong!"
                    else
                            echo "You are correct!"
            fi

Eu pesquisei, pesquisei e experimentei muitos exemplos diferentes, mas não consegui encontrar uma solução.

Se alguém puder me orientar sobre como implementar adequadamente o comando na condição if statement e escrever if em várias condições, agradeceria muito.

    
por James 18.05.2016 / 07:26

1 resposta

1

cas diz: "Este script tem tanto de errado com isso que nem sei por onde começar ... ”. Bem, tenho algumas ideias sobre por onde começar:

  • Por favor, não nos peça para depurar seu script e depois postar pseudo-código. Seu primeiro bloco de código contém backticks (') em lugares onde eles não vão funcionar.
  • Por favor, seja mais explícito. "Não consigo fazer minha declaração if funcionar" não é muito útil para nós. O que acontece?
  • Você deve sempre citar suas referências de variáveis de shell (por exemplo, "$middle" ) a menos que você tenha um bom motivo para não e você tem certeza que sabe o que está fazendo.
  • $(echo "$middle" | grep '.') será igual a 'true' somente se "$middle" for igual a true . A saída de grep é o conteúdo da (s) linha (s) da entrada que correspondem ao padrão dado como parâmetro.
  • . é um padrão que significa "qualquer caractere", então grep '.' irá corresponder a qualquer linha de entrada não em branco. Para verificar um período real ( . ), use grep '\.' . Observe que isso corresponderá a W. , mas também a .W , ... , 3.14159 , etc.
  • Por que você está fazendo um while ? Você espera que esse código seja executado mais de uma vez? Você espera obter resultados diferentes quando executado repetidamente nos mesmos dados? Onde está o final do ciclo?
  • -eq e -ne devem ser usados somente ao comparar inteiros; use = e != para strings.
  • O que você quer dizer? por -z STRING1 -ne STRING2 ?

Pode haver outros problemas, mas meus olhos doem muito para ver isso por mais tempo.

    
por 18.05.2016 / 08:50