Я хочу запрограммировать скрипт, который поможет мне в установке мыслей. (Я программирую это для упражнений Bash) Я хочу, чтобы у меня было меню с «выбором опции в опциях»
#!/bin/bash
download="~/Downloads/"
options='ls -l -d $download'
select option in $options; do
if [ "Test" = $option ]; then
clear
exit
else
echo hello
fi
done
Скрипт должен предоставить каждый файл в Download для выбора. И когда это файл tar.gz, он должен установить его в opt. Но я не знаю, как получить меню выбора
Вот минимальный рабочий пример. Отметьте следующее:
тильда (~
) не разворачивает внутренние двойные кавычки, так должен быть снаружи. Рассмотрите замену download=~/"Downloads"
download="$HOME/Downloads"
не использовать ls
для генерации списка имени файла - это повредится, если какие-либо из имен файлов будут иметь пробел. Используйте шарик оболочки *
, и помещенный результаты в массив
Так:
#!/bin/bash
download=~/"Downloads"
options=( "$download"/* )
select option in "${options[@]}" "quit"; do
case $option in
*.tar.gz)
echo "install some stuff"
;;
"quit")
break ;;
*)
echo "You chose $option" ;;
esac
done
Вы сказали изучение удара, таким образом, я думал, что Вы могли бы ценить другой вид использования ответа zenity
который является популярным GUI для удара, встроенного в Ubuntu.
Вот то, на что похоже zenity диалоговое окно выбора файла:
Вот то, как назвать сценарий и что он производит к Вашему терминалу при выборе объекта в списке:
$ Downloads.sh
Option: /home/rick/Downloads/nvhda.tar.xz
Вместо того, чтобы отобразить "Опцию": Ваша версия сценария будет выполнять a tar
команда.
#!/bin/bash
# NAME: Downloads.sh
# PATH: ~/askubuntu
# DESC: Select Download file
# DATE: July 15, 2019.
# NOTE: For: https://askubuntu.com/questions/1158485/how-to-get-ls-in-select-in
Array=( ~/"Downloads"/* )
while true; do
Option=$(zenity --list --title="Downloads.sh" --text="Select file" \
--ok-label "TAR process" --cancel-label "Exit" \
--width=800 --height=600 --column="Filename" "${Array[@]}" 2>/dev/null)
[[ "$Option" == "" ]] && break
echo "Option: $Option"
done
Избранная команда попытается отобразить каждое поле, разделенное пробелами, вкладками и символами новой строки. Таким образом, я не думаю, что Ваш образец сделает то, что Вы хотите. Вы не должны использовать "ls-l" для длинного списка или полномочий и владений, и размеры файла все будут полями, отображенными в избранных результатах оператора.
Не уверенный, если это точно, что Вы искали, но это находит все файлы (никакие каталоги или символьные ссылки) и решает, обработать ли его как резервное копирование PostgreSQL или просто регулярный файл. Вы могли всегда адаптировать его для поиска независимо от того, что это - Вы, надеются найти в каталоге загрузок.
Вы могли посмотреть на изменение, если оператор к случаю и пытается найти определенные расширения. Таким образом, Вы находите .tar или .gz или .cpio и так далее. Просто фигура, как снять изоляцию с расширения.
#!/bin/bash
download="/tempfs"
cd $download
options=$(ls -l |grep -v "^d" |awk '{print $9}')
select option in $options
do
if test "$(echo $option|grep ".dmp$")" = ""
then
echo "Process as normal file: ${option}"
exit 0
else
echo "Process as pg_dump file: ${option}"
exit 0
fi
done