Я хочу выполнить команду bash, подобную этой:
whiptail --title 'Select Database' --radiolist 'Select Database:' 10 80 2 \
1 production off \
2 localhost on
Whiptail довольно специфичен в отношении того, как указываются значения в списке радио.Они должны быть предоставлены каждый на своей линии, как показано. Вот хорошая статья по этому вопросу .
Список баз данных доступен в переменных с именем DBS
, а ACTIVE_DB
- это элемент списка радиоликов, который нужно выделить в диалоге whiptail.
Вот мои текущие усилия по созданию командной строки.Это, вероятно, слишком запутанно.
DBS="production localhost"
ACTIVE_DB="localhost"
DB_COUNT="$( echo "$DBS" | wc -w )"
DB_LIST="$(
I=1
echo ""
for DB in $DBS; do
SELECTED="$( if [ "$DB" == "$ACTIVE_DB" ]; then echo " on"; else echo " off"; fi )"
SLASH="$( if (( $I < $DB_COUNT )); then echo \\; fi )"
echo " $I $DB $SELECTED $SLASH"
echo ""
I=$(( I + 1 ))
done
)"
OPERATION="whiptail \
--title \"Select Database\" \
--radiolist \
\"Select Database:\" \
10 80 $DB_COUNT \"${DB_LIST[@]}\""
eval "${OPERATION}"
Я довольно близко.Как вы можете видеть, расширение содержит одинарные кавычки, которые запутывают вещи, а обратные косые черты отсутствуют в некоторых EOL:
set -xv
++ whiptail --title 'Select Database' --radiolist 'Select Database:' 10 80 2 '
1 production off
2 localhost on '
В решении необходимо как-то узнать, какой выбор сделал пользователь, или еслиони нажали ESC.ESC обычно устанавливает код возврата на 255, так что это не должно быть трудным, однако эта проблема становится действительно запутанной при попытке получить значение выбранного пользователем радиолистического элемента.