
Я пишу 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
Возможно, есть и другие проблемы, но мои глаза слишком болят, чтобы смотреть на это дальше.