【问题标题】:Bash Select displays weird with more than 9 options [duplicate]Bash Select 显示奇​​怪的选项超过 9 个 [重复]
【发布时间】:2021-08-18 06:22:09
【问题描述】:

我正在尝试在 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 如何读取编号参数有关。 但我找不到任何解决方案。 Why do bash command line arguments after 9 require curly brackets?

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

【问题讨论】:

    标签: bash


    【解决方案1】:

    您的文件 items.txt 似乎具有 Windows 行结尾 (\r\n) 而不是 Linux 行结尾 (\n)。使用 dos2unix items.txt 将其转换为 Linux 行尾。

    对于您的 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 &lt; file 做同样的事情,但速度更快,代码更少。

    【讨论】:

    • 谢谢,现在可以用了?
    【解决方案2】:

    作为Socowi said,或者将回车\r和换行\n添加到I内部F字段S分隔符IFS 环境变量。

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

    或者使用 DOS 或 Unix 行结束一次填充 items 数组:

    IFS=$'\r\n' read -r -d '' -a items <items.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      相关资源
      最近更新 更多