Я попытался ответить another SO question с помощью простого меню с помощью встроенного оператора select. Код отображает имена из /etc/passwd
, и позволяют выбрать имя, давая номер:Почему мое меню с выбором не работает в первый раз?
PS3="Enter a number: "
select name in $(cut -d: -f1 /etc/passwd) ; do
if [ -n "${name}" ]; then
break
fi
echo "Sorry, please enter a number as shown."
done
echo "Entry from passwd is: ${name}"
Штраф за первый раз, за исключением работ. Когда вы дадите правильный ответ в первый раз, он попросит вас повторить попытку.
Я попытался получить более подробное объяснение в первый раз, но я не мог получить воспроизводимую кулинарную книгу. Когда вы копируете этот код на свой сервер и даете правильный ответ, у вас, вероятно, будет такая же проблема. Когда вы повторяете команду (из истории или новой пасты), код теперь показывает проблему. Я попытался получить проблему снова, выйдя из системы и запустившись (иногда это работает) или перезагрузившись.
Я пробовал разные способы, чтобы воспроизвести проблему в других ситуациях (с использованием различных имен переменных, незаходимыми переменными, используя медленный список значений с select name in $(echo One; sleep 1; echo Two; sleep 2; echo Three; sleep 1);
и открытием новой оболочки.
я искал другие примеры с select
, но я . не можете найти ключи в других постах, как https://stackoverflow.com/a/16750755/3220113 и https://askubuntu.com/a/1716
Я пытался исправить мой код с синхронизацией и что, как представляется, обходным:
PS3="Enter a number: "
select name in $(cut -d: -f1 /etc/passwd) ; do
# is sync needed here?
sync
if [ -n "${name}" ]; then
break
fi
echo "Sorry, please enter a number as shown."
done
echo "Entry from passwd is: ${name}"
Я не мог воспроизвести е rror, когда я включаю команду sync. Является ли синхронизация действительно рабочим патчем и зачем мне это здесь?
Мне не нужны другие способы написать меню. Я уже нашел графический диалог Dialog from bash script и искал простую замену моего собственного сложного https://unix.stackexchange.com/a/115371/57293.
'sync' предназначен для сброса буферов в файлы, он не имеет ничего общего с переменными оболочки. – Barmar
Я не мог воспроизвести проблему. Это работает впервые для меня. http://ideone.com/ogpver – Barmar
ОК, я смог воспроизвести его, вставив команды в интерактивную оболочку, вместо того, чтобы запускать их в скрипте. – Barmar