
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 atrue
. A saída degrep
é ocontenteda(s) linha(s) da entrada que correspondem ao padrão fornecido como parâmetro..
é um padrão que significa “qualquer caractere”, portantogrep '.'
corresponderá a qualquer linha de entrada que não esteja em branco. Para verificar um período real (.
), usargrep '\.'
. 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? -eq
e-ne
deve 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.