Bash 脚本循环增加参数

Bash 脚本循环增加参数

我想用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 $MYPARAMSwhiptail使用参数--checklist, ""(由两个双引号组成的字符串)、15405"foo1"""和进行调用off。当您将变量扩展保留为不加引号时,其值将在每个空白序列处拆分为字段,并且生成的字段将被视为通配符模式,如果它们与任何文件匹配,则会扩展通配符模式。引号属于 shell 语法,它们仅由 shell 解析器扩展,而不作为变量扩展的一部分。

您可以使用内置函数调用 shell 解析器eval,但很难正确引用。如果这些项目可能包含在 shell 语法中不代表其自身的字符,那么这将特别困难。

数组是存储字符串列表的正确方法。假设您已成功设置MYARRAY要使用的标签列表,则可以循环该数组来构建参数数组。

MYPARAMS=()
for t in "${MYARRAY[@]}"; do
  MYPARAMS+=("$t" " " "off")
done
whiptail "${MYPARAMS[@]}"

相关内容