bash动态对话框

时间:2011-03-22 14:45:58

标签: bash dialog

我有一个编写简单bash脚本的任务,该脚本从文件中添加删除和查看条目。

要求是使用“对话框”

文件中的数据结构:

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

基本上我已经完成了除删除之外的所有事情,我知道如何进行删除本身(我认为“sed”?)

但我需要使用dialog --menu来显示搜索结果。

菜单项应该是整行文本我认为在选择项目后我将再次使用“grep”过滤掉唯一条目。

也许有人可以把我放在正确的方向上?

感谢。

1 个答案:

答案 0 :(得分:2)

我以前从未使用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输出)一次读取一行,并在{{我们不提供其他选项或参数)中放置它{1}}变量。 然后,我们将此值(引用为一个元素)添加到数组REPLY,另外还有一个args将空字符串添加到数组中。

我们必须使用""语法进行重定向,因为普通< <( ... )会为第二个命令创建一个子shell,这会导致对变量的更改不会传播回原始shell 。 (|表示从文件中读取输入<创建一个管道来读取命令的输出并生成其文件名。)

然后我们使用<( ... )参数展开 - "${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执行命令并将结果转换为字符串,然后在命令行中使用该字符串。

因此,我们需要一些命令,为每行grep输出产生两个“单词”(因为你的文件会给出三个单词)。由于你已经在使用sed,为什么不在这里使用呢? sed命令$( cmd )s/^.*$/"&" ""/中包含的行替换每一行,后跟另外两个引号。

""

现在的想法是使用

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

但不幸的是,bash的分词在命令替换后不尊重“”,因此bash给出了六个参数dialog --menu "Please select the line you want to edit" 40 60 34 $( sed -e 's/^.*$/"&" ""/' < input ) "NameSurnamemymail@mail.com""""AnotherNewperson@database.loc"""计划。 (实际上,使用dialog来禁止拆分似乎只适用于源中或""中给定文字的引号 - 但是eval在这里不起作用,因为我们也有换行符。)