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

Daa*_*rop 2 bash

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

items=()
  while read -r line; do
  items+=("$line")
done <items.txt
Run Code Online (Sandbox Code Playgroud)

这工作正常。

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

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
Run Code Online (Sandbox Code Playgroud)

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

IMG:显示很奇怪

IMG:少于 9 项

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

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

Soc*_*owi 6

似乎您的文件items.txt具有 Windows 行结尾 ( \r\n) 而不是 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
Run Code Online (Sandbox Code Playgroud)

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

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