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做同样的事情,但速度更快,代码更少。