我有一个数组 pkgLangs ,其中包含用户从上一个选择菜单(顶级)中选择的多个项目(字符串)。
顶级菜单中的一个选项会显示一个子菜单,用户可以从 pkgLangs 中删除项目。菜单构建如下:
declare -a pkgLangsBackup="${pkgLangs[@]}" # Backup the array in case the user cancels the removal operation
pkgLangs+=("Accept" "Cancel")
select pkgLang in "${pkgLangs[@]}"
do
if [[ "$pkgLang" == "Accept" ]]
then
echo "Changes have been accepted"
# Remove the "Accept" and "Cancel" from the array to reverse it to a semantically correct state (containing languages only!)
unset pkgLangs[${#pkgLangs[@]}-1] # Remove the "Accept"
unset pkgLangs[${#pkgLangs[@]}-1] # Remove the "Cancel"
break
elif [[ "$pkgLang" == "Cancel" ]]
then
echo "Changes have been cancelled"
pkgLangs=( $pkgLangsBackup )
break
else
echo "Removed $pkgLang from supported languages"
pkgLangs=( ${pkgLangs[@]/"$pkgLang"} ) # Using only this here removes the selected properly!
echo "New list of supported languages: "
arg_display pkgLangs
fi
done
如您所见,它是根据该数组的内容动态生成的。我使用此方法创建选择菜单,因为我不知道在上一级菜单中选择了哪些项目并添加到此菜单。删除项目在ELSE块中完成。 "取消"在ELIF块中进行处理并相应地接受"接受" - 在IF块中。
我遇到的问题是事物的显示方式。目前,只有当我重新进入此菜单时,列表的新状态才会用于创建用户可以选择的选项集。我想动态地重新生成菜单。
示例:
当前状态:
pkgLangs: "A" "B" "C" "D"
--> Entering the sub-menu
pkgLangs: "A" "B" "C" "D" "Accept" "Cancel"
--> Generate the sub-menu from pkgLangs:
1) A
2) B
3) C
4) D
5) Accept
6) Cancel
--> User removes B:
pkgLangs: "A" "C" "D" "Accept" "Cancel"
--> User sees again the following sub-menu:
1) A
2) B <---------- This is however no longer in pkgLangs!
3) C
4) D
5) Accept
6) Cancel
当然,即使用户选择B),由于数组的工作方式也不会导致错误 - 如果在那里找不到该项,也无法删除它,因此没有任何反应。
渴望状态:
pkgLangs: "A" "B" "C" "D"
--> Entering the sub-menu
pkgLangs: "A" "B" "C" "D" "Accept" "Cancel"
--> Generate the sub-menu from pkgLangs:
1) A
2) B
3) C
4) D
5) Accept
6) Cancel
--> User removes B:
pkgLangs: "A" "C" "D" "Accept" "Cancel"
--> User now sees the following sub-menu (note also that the numbering has also acknowledged the changes!):
1) A
2) C
3) D
4) Accept
5) Cancel
我是bash脚本的新手,可能有一些古怪的单行,更高级的用户可能会向我抛出,但我想知道如何修改这些代码,特别是为了满足将使用它的用户。
从我看到的选择循环生成它的结构一次,之后你循环它。这就是为什么在循环过程中与此结构有关的更改被简单地忽略,并且只有在重新生成结构时才会显示结果。
希望它清楚我的意思。如果您还有其他问题,我会尽我所能来回答这些问题。
谢谢!