У меня есть раздел скрипта оболочки, который раньше работал, но теперь он выдает другие результаты:
MSG=
while true
do
themenu
getchar =
case $answer in
1) export_Config_tables;;
2) export_config_tables_file;;
3) export_Accounts_tables;;
4) export_both_tables;;
5) load_config_tables;;
6) load_config_tables_file;;
x|X) break;;
q|Q) break;;
d|D) toggle_debug;;
*) badchoice;;
esac
done
clear
функция меню:
themenu () {
clear
echo `date `
echo
echo " summit Data Extract utility (SOPRA v1.1)"
echo
echo
echo "1. Extract summit configuration data only"
echo "2. Extract summit config data in flat files only"
echo "3. Extract summit account data only"
echo "4. Extract all data "
echo "5. Load summit configuration data from Dump"
echo "6. Load summit config data from flat files only"
echo
echo
echo "x. Exit"
echo
echo $MSG
echo
echo "Select option : ";
}
функция getchar
:
getchar (){
stty raw
answer=`dd bs=1 count=1 2> /dev/null `
stty -raw
}
функция плохого выбора:
badchoice () {
MSG="Invalid menu choice"
}
После выполнения скрипта отображается меню
<System date>
summit Data Extract utility (SOPRA v1.1)
1. Extract summit configuration data only
2. Extract summit config data in flat files only
3. Extract summit account data only
4. Extract all data
5. Load summit configuration data from Dump
6. Load summit config data from flat files only
x. Exit
Select option :
Пользователь вводит цифру 5, но она не отображается на экране, а после Enter2-3 нажатий отображается сообщение:
Invalid menu choice.
Я не могу понять, где это вызывает проблему. Функция меню выполняется нормально, но она вызывает проблему, когда входит в getchar()
функцию и case
оператор.
решение1
У меня не получилось так, как написано, вероятно, потому что
answer=`dd bs=1 count=1 2> /dev/null `
не выполняет команду и не устанавливает answer
возвращаемое значение, dd
а вместо этого присваивает строку ( dd bs=1 count=1
) переменной answer
.
Редактирование для придания расширения
answer=$(dd bs=1 count=1 2> /dev/null)
работало отлично