我正在尝试构建一个bash脚本,该脚本在执行时从特定路径获取所有目录,并在Zenity列表窗口中显示它们。在该窗口中,用户通过单选按钮选择目录名称并提交他的选择。
首先,这是我的bash脚本:
projectTypes=(~/application1/Snippets/Project\ Type/*/)
radioStates=()
for index in "${!projectTypes[@]}"; do
if [[ "$index" = "0" ]]; then
folderName=$(basename "${projectTypes[$index]}")
projectTypes[$index]="$folderName"
radioStates[$index]=TRUE
else
folderName=$(basename "${projectTypes[$index]}")
projectTypes[$index]="$folderName"
radioStates[$index]=FALSE
fi
done
PROJTYPE=$( zenity \
--list --radiolist \
--title="Project Type" --text="Please select project type:" \
--column="Select" --column="Project Type" \
$( \
for index in "${!projectTypes[@]}"; do
printf "%s %s " "${radioStates[$index]}" "${projectTypes[$index]}"
done
) \
)
所以我正在尝试检索“Project Type”文件夹中找到的所有目录的名称。在“Project Type”文件夹中,我有以下目录:
~/application1/Snippets/Project Type/Angular 2/ ~/application1/Snippets/Project Type/PrestaShop/ ~/application1/Snippets/Project Type/WordPress/
现在我设法正确地将目录的名称作为“Angular 2”,“PrestaShop”和“WordPress”获取,但我不能正确地将它们输出到Zenity列表窗口。
Expected Output: SELECT | PROJECT TYPE --------------------- (*) | Angular 2 ( ) | PrestaShop ( ) | WordPress Current erroneous output: SELECT | PROJECT TYPE --------------------- (*) | Angular ( ) | FALSE ( ) | FALSE ( ) |
Current erroneous output - Screenshot
我可以假设问题是我试图扩展数组元素的方式,但经过数小时的研究和反复试验,我无法确定应该如何进行。
无论如何,我非常感谢任何帮助!
干杯!
答案 0 :(得分:1)
问题是zenity
需要参数zenity ... "Angular 2" ...
,但需要zenity ... "Angular" "2"
。为了避免这种情况,我们可以创建一个数组来保存zenity
的参数并以安全的方式扩展它:
# ...
argList=()
for (( i = 0; i < "${#projectTypes[@]}"; ++i )); do
argList[2*i]="${radioStates[i]}"
argList[2*i + 1]="${projectTypes[i]}"
done
PROJTYPE=$( zenity \
--list --radiolist \
--title="Project Type" --text="Please select project type:" \
--column="Select" --column="Project Type" \
"${argList[@]}" \
)
由于您只想将第一个条目设置为true,因此可以省略数组radioStates
并写入
argList=()
for (( i = 0; i < "${#projectTypes[@]}"; ++i )); do
argList[2*i]=FALSE
argList[2*i + 1]="${projectTypes[i]}"
argList[0]=TRUE
done
argList[0]=TRUE
位于循环内部,以确保argList
为空时projectTypes
保持为空。我们将分配多次,但保存了一个if语句作为回报。