¿Cómo escribir un script bash mientras se usa el comando como condición en la declaración if?

¿Cómo escribir un script bash mientras se usa el comando como condición en la declaración if?

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 igual true. La salida de  grepes 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 que grep '.'coincidirá con cualquier línea de entrada que no esté en blanco. Para verificar un período real (.), usar grep '\.'. 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?
  • -eqy-nedebe 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.

información relacionada