我想用whiptail
根据另一个程序的输出生成复选框列表。第一个程序输出的每一行中只需要第一个单词,因此我使用awk
.
要了解 bash 如何处理数组,我一直在使用 tldp 的这个链接。我了解了如何检查数组的大小这里。
这没有按预期运行,但如果我复制echo
输出,并whiptail
在它前面输入“”,它就可以工作。
我该如何修复此代码以使其正常工作?
例子program.sh
:
#! /bin/bash
find ./ -printf "%f\n"
例子mainscript.sh
:
#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=" --checklist \"\" 15 40 5"
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
MYPARAMS+=" \"${MYARRAY[$i]}\" \" \" off"
i=$[$i+1]
done
whiptail $MYPARAMS
echo $MYPARAMS
exit
答案1
这不是一个非常理想的解决方案,但您可以使用eval
:
eval whiptail $MYPARAMS
我怀疑问题出在引用上。但是,您可以将 MYPARAMS 构造为数组,它将按预期工作:
#! /bin/bash
MYARRAY=($(./program.sh -l | awk '{print $1;}'))
MYPARAMS=( --checklist "" 15 40 5 )
i=0
while [[ $i -lt ${#MYARRAY[@]} ]]
do
MYPARAMS+=( "${MYARRAY[$i]}" " " off )
i=$[$i+1]
done
whiptail "${MYPARAMS[@]}"
echo "${MYPARAMS[@]}"
exit
答案2
为什么要创建MYPARAMS
字符串而不是数组?由于MYPARAMS
是类似 的字符串--checklist "" 15 40 5 "foo1" " " off
,因此 shell 命令行whiptail $MYPARAMS
会whiptail
使用参数--checklist
, ""
(由两个双引号组成的字符串)、15
、40
、5
、"foo1"
、"
、"
和进行调用off
。当您将变量扩展保留为不加引号时,其值将在每个空白序列处拆分为字段,并且生成的字段将被视为通配符模式,如果它们与任何文件匹配,则会扩展通配符模式。引号属于 shell 语法,它们仅由 shell 解析器扩展,而不作为变量扩展的一部分。
您可以使用内置函数调用 shell 解析器eval
,但很难正确引用。如果这些项目可能包含在 shell 语法中不代表其自身的字符,那么这将特别困难。
数组是存储字符串列表的正确方法。假设您已成功设置MYARRAY
要使用的标签列表,则可以循环该数组来构建参数数组。
MYPARAMS=()
for t in "${MYARRAY[@]}"; do
MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"