
Estoy escribiendo un script bash para procesar la entrada desde el formulario html.
El primer problema es que no puedo hacer que mi declaración if funcione mientras uso el comando como condición. Estoy tratando de verificar la entrada del usuario de la inicial del segundo nombre y ajustarla para asegurarme de que se pueda combinar en $answer.
A continuación se muestra un ejemplo de cómo se supone que debe procesarse.
El usuario ingresa tres campos diferentes desde el formulario html; nombre, inicial del segundo nombre, apellido.
Nombre: George
Inicial del segundo nombre: W.
Apellido: Bush
El script de Shell procesará y comparará la entrada del usuario y la respuesta real. La respuesta real es "George W. Bush".
Entrada del usuario:
George W. Bush = eco correcto "¡Tienes razón!"
George W Bush = corrige colocando automáticamente un punto después de "W" ¡
George Bush! = incorrecto y repite "¡Sin inicial del segundo nombre!"
Geor W. Bus! = incorrecto y eco "¡El nombre y el apellido están incorrectos!"
#! /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
El primer problema comienza aquí.
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 en el bucle while con la declaración if.
Estoy tratando de comparar la entrada del usuario $respuesta con la respuesta real $presidente y hacerme eco de lo que está mal con $respuesta. No se repite nada para esta sección.
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
Necesito implementar correctamente un comando en la condición de la declaración if y escribir una declaración if con múltiples condiciones.
Respuesta1
cas dice: "Este script tiene tantos errores que ni siquiera sé por dónde empezar...". Bueno, tengo algunas ideas sobre por dónde empezar:
- No nos pida que depuremos su script y luego publiquemos pseudocódigo. Su primer bloque de código contiene comillas invertidas (`) en lugares donde no funcionarán.
- Por favor sea más explícito. "No puedo hacer que mi declaración if funcione" no nos resulta muy útil. ¿Lo que sucede?
- Siempre debe citar las referencias de las variables de shell (por ejemplo,
"$middle"
) a menos que tenga una buena razón para no hacerlo y esté seguro de saber lo que está haciendo. $(echo "$middle" | grep '.')
será igual'true'
sólo si"$middle"
es igualtrue
. La salida degrep
es lacontenidode las líneas de la entrada que coinciden con el patrón dado como parámetro..
es un patrón que significa "cualquier carácter", por lo quegrep '.'
coincidirá con cualquier línea de entrada que no esté en blanco. Para verificar un período real (.
), usargrep '\.'
. Tenga en cuenta que esto coincidiráW.
pero también.W
,...
,3.14159
, etc.- ¿Por qué estás haciendo un
while
? ¿Espera que ese código se ejecute más de una vez? ¿Espera que obtenga resultados diferentes cuando se ejecuta repetidamente con los mismos datos? ¿Dónde está el final del ciclo? -eq
y-ne
debe usarse solo al comparar números enteros; usar=
y!=
para cuerdas.- Que quieres decir con ?
-z STRING1 -ne STRING2
Puede que haya otros problemas, pero me duelen demasiado los ojos como para seguir mirando esto.