Как получить ls в "select * in *?"

Я хочу запрограммировать скрипт, который поможет мне в установке мыслей. (Я программирую это для упражнений 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. Но я не знаю, как получить меню выбора

0
задан 15 July 2019 в 20:31

3 ответа

Вот минимальный рабочий пример. Отметьте следующее:

  1. тильда (~) не разворачивает внутренние двойные кавычки, так должен быть снаружи. Рассмотрите замену download=~/"Downloads" download="$HOME/Downloads"

  2. не использовать 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
1
ответ дан 23 October 2019 в 23:37

Вы сказали изучение удара, таким образом, я думал, что Вы могли бы ценить другой вид использования ответа zenity который является популярным GUI для удара, встроенного в Ubuntu.

Диалоговое окно Zenity

Вот то, на что похоже zenity диалоговое окно выбора файла:

Downloads.sh screenshot.png

Вызов сценария

Вот то, как назвать сценарий и что он производит к Вашему терминалу при выборе объекта в списке:

$ Downloads.sh
Option: /home/rick/Downloads/nvhda.tar.xz

Вместо того, чтобы отобразить "Опцию": Ваша версия сценария будет выполнять a tar команда.

Downloads.sh колотят сценарий

#!/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
1
ответ дан 23 October 2019 в 23:37

Избранная команда попытается отобразить каждое поле, разделенное пробелами, вкладками и символами новой строки. Таким образом, я не думаю, что Ваш образец сделает то, что Вы хотите. Вы не должны использовать "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
0
ответ дан 23 October 2019 в 23:37

Другие вопросы по тегам:

Похожие вопросы: