动态对话框--bash中的菜单框

动态对话框--bash中的菜单框,bash,Bash,我正在寻找关于在bash中创建动态对话框——菜单框的好解释。我正在尝试从具有如下结构的文件加载用户列表: ------ user ------ /rw412 0.2 /rx511 23.1 /sgo23 9.2 /fs352 1.4 /... ------ another_user ------ /rw412 0.3 / and so on... 当然,用户名介于---- 我真的不知道如何在对话框中使用循环。我还试图避免创建额外的文件 请提供帮助以下是一个使用对话框的示例。选项阵列

我正在寻找关于在bash中创建动态对话框——菜单框的好解释。我正在尝试从具有如下结构的文件加载用户列表:

------ user ------  
/rw412 0.2 /rx511 23.1 /sgo23 9.2  
/fs352 1.4 /...  
------ another_user ------
/rw412 0.3 / and so on...
当然,用户名介于
----

我真的不知道如何在对话框中使用循环。我还试图避免创建额外的文件


请提供帮助

以下是一个使用
对话框
的示例。
选项
阵列可以通过多种方式构建(见下文)

以下是构建选项阵列的一种方法:

count=0
while read -r dashes1 username dashes2
do
    if [[ $dashes1 == --*-- && $dashes2 == --*-- ]]
    then
        options+=($((++count)) "$username")
    fi
done < inputfile
count=0
读取时-r dashes1用户名dashes2
做
如果[[$dashes1==-*-&&&$dashes2==-*-]]
然后
选项+=($(++count))“$username”)
fi
完成<输入文件
正常

根据丹尼斯·威廉姆森的线索和我自己的想法,我得出了这样的结论

#!/bin/bash
c=0
while read -r dashes1 username dashes2
do
  if [[ $dashes1 == --*-- && $dashes2 == --*-- ]]
  then
    options=("${options[@]}" "$((++c))" "$username")
  fi
done < inputfile
cmd=(dialog --backtitle "title" --menu "Select_user:" 22 38 2) #2 becouse 
i know there will be 2 options
command=`echo "${cmd[@]}" "${options[@]}" "2>file"`
$command
#/bin/bash
c=0
读取时-r dashes1用户名dashes2
做
如果[[$dashes1==-*-&&&$dashes2==-*-]]
然后
选项=(“${options[@]}”“$(++c))“$username”)
fi
完成<输入文件
cmd=(对话框--背景标题“title”--菜单“选择用户:”22 38 2)#2 becouse
我知道有两种选择
command=`echo“${cmd[@]}”“${options[@]}”“2>文件”`
$command
现在,有这样一个错误:
错误:应为2个参数,但仅找到1个。


为什么呢???

遵循上述线索,并有自己的想法;还有一种方法:

#!/bin/bash

MENU_OPTIONS=
COUNT=0

for i in `ls`
do
       COUNT=$[COUNT+1]
       MENU_OPTIONS="${MENU_OPTIONS} ${COUNT} $i off "
done
cmd=(dialog --separate-output --checklist "Select options:" 22 76 16)
options=(${MENU_OPTIONS})
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
for choice in $choices
do
       " WHATEVER from HERE"
done
我从一个非常相似的问题中得到的答案。我在一群人的帮助下得出了这个答案,但在野外找不到;我认为在这里添加它可能会帮助其他人

${options[@]}
数组需要以下(相当奇怪的)结构才能工作。这是在Ubuntu 18.04的bash上测试的:

 #Dynamic dialogs require an array that has a staggered structure
 #array[1]=1
 #array[2]=First_Menu_Option
 #array[3]=2
 #array[4]=Second_Menu_Option
下面是从参数中读取目录列表并从中创建动态菜单的bash代码:

 #! /bin/bash
 #usage: Dynamic_Menu.bash /home/user/target_directory

 declare -a array

 i=1 #Index counter for adding to array
 j=1 #Option menu value generator

 while read line
 do     
    array[ $i ]=$j
    (( j++ ))
    array[ ($i + 1) ]=$line
    (( i=($i+2) ))

 done < <(find $1 -type f) #consume file path provided as argument

 #Define parameters for menu
 TERMINAL=$(tty) #Gather current terminal session for appropriate redirection
 HEIGHT=20
 WIDTH=76
 CHOICE_HEIGHT=16
 BACKTITLE="Back_Title"
 TITLE="Dynamic Dialog"
 MENU="Choose a file:"

 #Build the menu with variables & dynamic content
 CHOICE=$(dialog --clear \
                 --backtitle "$BACKTITLE" \
                 --title "$TITLE" \
                 --menu "$MENU" \
                 $HEIGHT $WIDTH $CHOICE_HEIGHT \
                 "${array[@]}" \
                 2>&1 >$TERMINAL)
#/bin/bash
#用法:Dynamic_Menu.bash/home/user/target_目录
声明一个数组
i=1#用于添加到数组的索引计数器
j=1#选项菜单值生成器
读行时
做
数组[$i]=$j
((j++)
数组[($i+1)]=$line
((i=($i+2)))
完成<&1>$终端)

这似乎可行,但它给了我一个错误:
temp:line 7:意外标记附近的语法错误
$(++c))'temp:line 7:`options+=($(++c))“$user”)`@kasper:脚本中的shebang行是什么?@Dennis Williamson#!bin/bash还有其他方法写这句话吗?非常好用,我会寻找很久才能找到这个优雅的解决方案。Thx@Dennis+1票:-)好的。。。我做到了:D。我刚从
“2>文件”
中取下那些
。令人惊叹的!您能告诉我如何使这个命令接受backtitle或menu中的两个单词吗?像
--backtitle“title title”
--backtitle“title title”
应该可以正常工作。不要把最后两行做得像上面你所说的那样,而要像我在回答中所说的那样去做。这就是允许您捕获用户所做选择的原因,以便您可以对其进行操作。您使用的是什么版本的Bash?这可能就是
+=
不起作用的原因。
bash--version
显示它是2.05b:)而“”内部的空间不起作用,很遗憾。我这样做的方式也给了我所需要的。选择将写入文件,然后写入变量。使用该变量,我可以执行
案例
如果
。或者我的观点有什么危险吗?我不明白你怎么能接受你自己的答案,当它问为什么在最后一句中被打破。六年后,这仍然是动态检查表的最好例子之一。。。好的,我在3天内找到的唯一一个:)
 #! /bin/bash
 #usage: Dynamic_Menu.bash /home/user/target_directory

 declare -a array

 i=1 #Index counter for adding to array
 j=1 #Option menu value generator

 while read line
 do     
    array[ $i ]=$j
    (( j++ ))
    array[ ($i + 1) ]=$line
    (( i=($i+2) ))

 done < <(find $1 -type f) #consume file path provided as argument

 #Define parameters for menu
 TERMINAL=$(tty) #Gather current terminal session for appropriate redirection
 HEIGHT=20
 WIDTH=76
 CHOICE_HEIGHT=16
 BACKTITLE="Back_Title"
 TITLE="Dynamic Dialog"
 MENU="Choose a file:"

 #Build the menu with variables & dynamic content
 CHOICE=$(dialog --clear \
                 --backtitle "$BACKTITLE" \
                 --title "$TITLE" \
                 --menu "$MENU" \
                 $HEIGHT $WIDTH $CHOICE_HEIGHT \
                 "${array[@]}" \
                 2>&1 >$TERMINAL)