动态生成的bash选择菜单 - 删除一个或多个菜单项时更新菜单项

时间:2015-06-06 23:43:10

标签: bash shell menu

我有一个数组 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脚本的新手,可能有一些古怪的单行,更高级的用户可能会向我抛出,但我想知道如何修改这些代码,特别是为了满足将使用它的用户。

从我看到的选择循环生成它的结构一次,之后你循环它。这就是为什么在循环过程中与此结构有关的更改被简单地忽略,并且只有在重新生成结构时才会显示结果。

希望它清楚我的意思。如果您还有其他问题,我会尽我所能来回答这些问题。

谢谢!

0 个答案:

没有答案