BashSelect显示奇​​怪的超过9个选项

我正在尝试在 bash 中创建一个选择,让您从 .txt 文件中选择项目。每个项目都是一个新行,我读取这些项目并将它们放入一个数组中:

items=()
  while read -r line; do
  items+=("$line")
done <items.txt

这工作正常。

之后,我将它们放入一个选择中:

PS3="Choose Item > "
 select item in "${items[@]}" "Cancel"; do
  case ${item} in
   Cancel)
     echo "You chose to cancel"
     break
     ;;
   *)
     echo "You chose ${item}"
     break
     ;;

 esac
done

选择逐行显示所有项目。这一切正常,直到有超过 9 个项目。当有超过 9 个项目时,它会显示它们真的很奇怪。它还结合了项目名称。见下图。

我在网上阅读它可能与 bash 如何读取编号参数有关。但我找不到任何解决方案。为什么 9 之后的 bash 命令行参数需要大括号?

有人知道如何解决 bash 选择中最多只能有 9/10 个选项的问题吗?

回答

似乎您的文件items.txt具有 Windows 行结尾 ( rn) 而不是 Linux 行结尾 ( n)。使用dos2unix items.txt.

对于您的 10 个项目,bash 会在多列中显示选项。输出应该看起来像......

1) item1     3) item3    5) item5    7) item7    9) item9
2) item2     4) item4    6) item6    8) item8   10) item10

...但由于 Windows 行尾,每个项目都有一个尾随r,这会导致终端将光标重置到行首并覆盖已打印的文本。因此,只有每行中的最后一项可见。

顺便说一句:要将文件读入数组,您不需要循环。mapfile -t array < file做同样的事情,但速度更快,代码更少。


以上是BashSelect显示奇​​怪的超过9个选项的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>