动态对话框--bash中的菜单框
我正在寻找关于在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... 当然,用户名介于---- 我真的不知道如何在对话框中使用循环。我还试图避免创建额外的文件 请提供帮助以下是一个使用对话框的示例。选项阵列
------ 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)