Как написать bash-скрипт, используя команду в качестве условия в операторе if?

Как написать bash-скрипт, используя команду в качестве условия в операторе if?

Я пишу bash-скрипт для обработки ввода из html-формы.

Первая проблема в том, что я не могу заставить работать свой оператор if при использовании команды в качестве условия. Я пытаюсь проверить ввод пользователем отчества и скорректировать его, чтобы убедиться, что его можно объединить в $answer.

Вот пример того, как это должно обрабатываться.

Пользователь вводит три различных поля из HTML-формы: имя, инициал отчества, фамилия.

Имя: Джордж.
Инициал отчества: W.
Фамилия: Буш.

Скрипт оболочки обработает и сравнит пользовательский ввод и фактический ответ. Фактический ответ: "Джордж Буш-младший"

Пользовательский ввод:
Джордж Буш-младший = правильно echo "Вы правы!"
Джордж Буш-младший = правильно, автоматически поставив точку после "W"
Джордж Буш != неправильно и echo "Без инициала отчества!"
Джордж Буш-младший != неправильно и echo "Имя и фамилия неверны!"

#! /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

Первая проблема начинается здесь.

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

Вторая проблема в цикле while с оператором if.

Я пытаюсь сравнить пользовательский ввод $answer с фактическим ответом $president и вывести на экран то, что не так с $answer. Для этого раздела ничего не выводится на экран.

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

Мне нужно правильно реализовать команду в условии оператора if и написать оператор if с несколькими условиями.

решение1

cas говорит: «В этом сценарии так много ошибок, что я даже не знаю, с чего начать…». Ну, у меня есть несколько идей, с чего начать:

  • Пожалуйста, не просите нас отладить ваш скрипт, а затем выложить псевдокод. Ваш первый блок кода содержит обратные кавычки (`) в местах, где они не будут работать.
  • Пожалуйста, будьте более ясны. «Я не могу заставить работать свой оператор if» не очень-то нам помогает. Что происходит?
  • Всегда следует заключать в кавычки ссылки на переменные оболочки (например, "$middle"), если у вас нет веской причины не делать этого и вы не уверены, что знаете, что делаете.
  • $(echo "$middle" | grep '.')будет равно 'true' только если "$middle"равно true. Выход  grep— этосодержаниестрок из входных данных, соответствующих шаблону, указанному в качестве параметра.
  • .— это шаблон, который означает «любой символ», поэтому grep '.'будет соответствовать любой непустой строке ввода. Для проверки фактической точки (.), используйте grep '\.'. Обратите внимание, что это будет соответствовать , W.но также .W, ..., 3.14159, и т. д.
  • Зачем вы делаете while? Вы ожидаете, что этот код будет выполнен больше одного раза? Вы ожидаете, что он даст разные результаты при повторном выполнении на тех же данных? Где конец цикла?
  • -eqи-neследует использовать только при сравнении целых чисел; используйте=и!=для струн.
  • Что вы подразумеваете под ?-z STRING1 -ne STRING2

Возможно, есть и другие проблемы, но мои глаза слишком болят, чтобы смотреть на это дальше.

Связанный контент