динамический диалог bash - PullRequest
       4

динамический диалог bash

1 голос
/ 22 марта 2011

У меня есть задача написать простой bash-скрипт, который добавляет и удаляет записи из файла.

Требуется использовать «диалог»

структура данных в файле:

Name Surname mymail@mail.com
Another New person@database.loc

В основном я выполнил все, кроме удаления, я знаю, как сделать само удаление (с «sed», я думаю?)

Но мне нужно использовать dialog --menu для отображения результатов поиска.

Пункт меню должен быть целой строкой текста, я думаю, что после выбора элемента я снова буду использовать «grep», чтобы отфильтровать уникальную запись.

Может быть, кто-нибудь может поставить меня направильное направление?

Спасибо.

1 Ответ

2 голосов
/ 22 марта 2011

Я использовал dialog никогда раньше, но, возможно, я все еще могу помочь. Попробуйте это:

declare -a args=()


while read
do
    args+=("$REPLY" "")
done < <( grep '@' example.txt )
dialog --menu "Please select the line you want to edit" 40 60 34 "${args[@]}"

Как это работает?

dialog --menu принимает следующие аргументы:

  • текст вопроса
  • высота и ширина окна
  • высота меню (которая должна быть на 7 меньше высоты окна, чтобы использовать его полностью, по моему опыту)
  • пары строки тега и описание .

    Выбранная строка тега затем выводится (в stderr) в конце.

Как создать такой список строк из нашего grep вывода? Неудачная попытка описана ниже, здесь рабочая.

Команда read читает одну строку за раз из стандартного ввода (на который мы перенаправили вывод grep) и помещает его (если мы не даем другие параметры или аргументы) в переменную REPLY. Затем мы добавляем это значение (которое указывается как один элемент) в массив args, и дополнительно один "", чтобы добавить пустую строку в массив.

Мы должны использовать синтаксис < <( ... ) для перенаправления, поскольку обычный | создает подоболочку для второй команды, что приводит к тому, что изменения переменных не передаются обратно в исходную оболочку. (< означает чтение входных данных из файла , а <( ... ) создает канал для чтения выходных данных команды и приводит к ее имени файла.)

Затем мы используем расширение параметра "${args[@]}" - @ приводит к тому, что каждый элемент указывается в кавычках в качестве результата. Так что для вашего примера командная строка теперь выглядит как

dialog --menu "Please select the line you want to edit" 40 60 34 "Name Surname mymail@mail.com" "" "Another New person@database.loc" ""

Это создает двухстрочное меню с полными строками в качестве «тега» и пустой строкой в ​​качестве пояснения.

Вам понадобится какой-то способ перехватить стандартный вывод ошибок, поскольку он помещает результат туда.


Еще одна идея, которая не работает:

Вопрос в том, как получить вывод grep в командной строке dialog, чтобы он формировал два аргумента для каждой строки.

Здесь помогают следующие синтаксические конструкции:

  • Подстановка команд: $( cmd ) выполняет команду и преобразует результат в строку, которая затем используется в точке командной строки.

Итак, нам нужна какая-то команда, которая создает два «слова» для каждой строки вывода grep (поскольку ваш файл даст три слова). Поскольку вы уже используете sed, почему бы не использовать его и здесь? Команда sed s/^.*$/"&" ""/ заменяет каждую строку строкой, заключенной в "", за которой следуют еще две кавычки.

"Name Surname mymail@mail.com" ""
"Another New person@database.loc" ""

Идея была бы теперь использовать

dialog --menu "Please select the line you want to edit" 40 60 34 $( sed -e 's/^.*$/"&" ""/' < input )

но, к сожалению, разделение слов в bash не учитывает "" после подстановки команд, поэтому bash дает шесть аргументов "Name, Surname, mymail@mail.com", "", "Another, New , person@database.loc" и "" для программы dialog. (Фактически, использование "" для запрета расщепления, похоже, работает только для кавычек, заданных литералом в источнике или в eval - но здесь eval не работает, так как у нас тоже есть разрывы строк.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...