Это, похоже, один из лучших результатов при поиске кнута, и ни один из предыдущих результатов не помог мне. Вот что я использовал:
#! /bin/bash
shopt -s nullglob
dir=`pwd`
cd /path/to/files
arr=(*.tgz)
for ((i=0; i<${#arr[@]}; i++)); do j=$((2*$i+2)); a[j]="${arr[$i]}"; a[j+1]=""; done
a[0]=""
# Next line has extra spaces at right to try to center it:
a[1]="Please make a selection from the files below "
result=$(whiptail --ok-button "OK button text" --cancel-button "Cancel Button Text" --title "Title Text" --backtitle "Text at upper left corner of page" --menu "Menu Text (not used??)" 30 160 24 "${a[@]}" 2>&1 >/dev/tty)
if [[ $? = 0 ]]
then
# ge 5 in next line should be length of file extension including . character, plus 1
[ ${#result} -ge 5 ] && outfile="/path/to/files/$result" || echo "Selection not made"
fi
cd "$dir"
$ результат будет пустым, если не был сделан правильный выбор. Я добавил фиктивную выборку вверху списка, которая в результате возвращает пустую строку, чтобы вы случайно не выбрали неправильный файл, случайно нажав Enter сразу после появления меню. Если вы не хотите этого, то в строке «for» уберите +2 в «do j = $ ((2 * $ i + 2))», а также следующие две строки, которые устанавливают [0] и a [1] явно.
Запутанная вещь в whiptail заключается в том, что при чтении из массива в такой ситуации он ожидает два элемента данных в строке, оба из которых отображаются, причем первый - это результат, который вы хотите вернуть, если ожидается строка (которая в в некоторых ситуациях это может быть буква или цифра, а вторая - любой описательный текст, который вам может понадобиться. Вот почему для первой строки я использую [0], чтобы дать пустую строку в качестве результата, и a [1] в качестве описательного текста, но оттуда первый элемент в паре содержит имя файла (это то, что я на самом деле хочу вернуть), а вторая - пустая строка, так как я не хочу отображать в этих строках любой текст, кроме имени файла.
Также в предыдущем посте говорилось, что whiptail вернул код ошибки 255, если была нажата кнопка отмены, но это не относится к имеющейся у меня версии - он возвращает 1. Поэтому я просто проверяю код ошибки 0, и если если я предполагаю, что это может быть допустимая запись, тогда я проверяю правильную длину строки (больше, чем просто количество символов в расширении файла, включая символ.), чтобы убедиться.