将包含空白的数组元素传递给Zenity窗口
问题描述:
我试图构建一个bash脚本,该脚本在执行时从特定路径获取所有目录并将它们显示在Zenity列表窗口中。在该窗口中,用户通过单选按钮选择目录名称并提交他的选择。将包含空白的数组元素传递给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
) \
)
所以我想检索所有目录在“项目类型”文件夹中找到的名称。里面的“项目类型”文件夹中我有以下目录:
~/application1/Snippets/Project Type/Angular 2/ ~/application1/Snippets/Project Type/PrestaShop/ ~/application1/Snippets/Project Type/WordPress/
现在我设法得到正确的目录名作为‘角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
我认为这个问题是我试图扩大数组元素的方式,但研究和反复试验了几个小时之后,我一直无法确定如何我应该这样做。
无论如何,我非常感谢任何帮助!
干杯!
答
解决问题
的问题是,需要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语句作为回报。
工作很精美,而且更具可读性。谢谢! 我试图避免在同一个数组(布尔和字符串)中有两个_types_数据,所以这就是为什么我使用两个数组。在解决方案中使用多种类型的数据填充数组是否常见? –
我不会说它是*标准的解决方案,但您的问题也不是我通常面对的问题。但是,所有数组条目都具有相同的类型,即* string *。 Bash支持[不同类型](https://linux.die.net/Bash-Beginners-Guide/sect_10_01.html),但没有布尔类型。无论如何,大多数人只是坚持默认的字符串类型。 – Socowi