Como escrever um script bash ao usar o comando como condição na instrução if?

Como escrever um script bash ao usar o comando como condição na instrução if?

Estou escrevendo um script bash para processar a entrada do formulário HTML.

O primeiro problema é que não consigo fazer minha instrução if funcionar enquanto uso o comando como condição. Estou tentando verificar a entrada do usuário da inicial intermediária e ajustá-la para ter certeza de que pode ser combinada em $ resposta.

Aqui está um exemplo de como deve ser processado.

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

Nome: George
Inicial do meio: W.
Sobrenome: Bush

O script Shell processará e comparará a entrada do usuário e a resposta real. A resposta real é "George W. Bush"

Entrada do usuário:
George W. Bush = eco correto "Você está correto!"
George W Bush = corrija colocando automaticamente ponto final após "W"
George Bush! = errado e ecoe "Sem inicial do meio!"
Geor W. Bus != errado e eco "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

O 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 no loop while com instrução if.

Estou tentando comparar a entrada do usuário $ resposta com a resposta real $ presidente e repetir o que há de errado com $ resposta. Nada é repetido nesta 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

Preciso implementar corretamente um comando na condição da instrução if e escrever uma instrução if com várias condições.

Responder1

cas diz: “Este script tem tantas coisas erradas 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 pseudocódigo. Seu primeiro bloco de código contém crases (`) em locais onde eles não funcionarão.
  • Por favor, seja mais explícito. “Não consigo fazer minha instrução if funcionar” não é muito útil para nós. O que acontece?
  • Você deve sempre citar as referências de variáveis ​​do shell (por exemplo, "$middle"), a menos que tenha um bom motivo para não fazê-lo e tenha certeza de que sabe o que está fazendo.
  • $(echo "$middle" | grep '.')será igual 'true' apenas se "$middle"for igual a true. A saída de  grepé ocontenteda(s) linha(s) da entrada que correspondem ao padrão fornecido como parâmetro.
  • .é um padrão que significa “qualquer caractere”, portanto grep '.'corresponderá a qualquer linha de entrada que não esteja em branco. Para verificar um período real (.), usar grep '\.'. Observe que isso corresponderá, W.mas também .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 que obtenha resultados diferentes quando executado repetidamente nos mesmos dados? Onde está o fim do loop?
  • -eqe-nedeve ser usado apenas ao comparar números inteiros; usar=e!=para cordas.
  • O que você quer dizer com ?-z STRING1 -ne STRING2

Pode haver outros problemas, mas meus olhos doem demais para olhar mais para isso.

informação relacionada