我可以更改选择选项的显示方式吗?

我可以更改选择选项的显示方式吗?

我正在 bash 中使用 select 和 case。我目前有九个选项,这形成了一个漂亮、整洁的 3x3 选项网格,但它显示如下:

    1) show all elements  4) write to file      7) clear elements
    2) add elements       5) generate lines     8) choose file
    3) load file          6) clear file         9) exit

我希望它显示在列之前的行中:

1) show all elements  2) add elements    3) load file
4) write to file      5) generate lines  6) clear file  
7) clear elements     8) choose file     9) exit

有什么办法可以做到这一点吗?最好是在脚本中易于设置和取消设置的东西,例如 shell 选项。如果重要的话,选项将存储在数组中,并在 case 块中通过数组的索引进行引用。

OPTIONS=("show all elements" "add elements" "load file" "write to file" "generate lines" "clear file" "clear elements" "choose file" "exit")

...

select opt in "${OPTIONS[@]}"
do
case $opt in
    "${OPTIONS[0]}")

...

    "${OPTIONS[8]}")
        echo "Bye bye!"
        exit 0
        break
        ;;

    *)
        echo "Please enter a valid option."
esac
done

答案1

创建您自己的“选择”:

#!/bin/bash

options=("show all elements" "add elements" "load file" "write to file" "generate lines" "clear file" "clear elements" "choose file" "exit")
width=25
cols=3

for ((i=0;i<${#options[@]};i++)); do 
  string="$(($i+1))) ${options[$i]}"
  printf "%s" "$string"
  printf "%$(($width-${#string}))s" " "
  [[ $(((i+1)%$cols)) -eq 0 ]] && echo
done

while true; do
  echo
  read -p '#? ' opt
  case $opt in
    1)
      echo "${options[$opt-1]}"
      ;;

    2)
      echo "${options[$opt-1]}"
      ;;

    9)
      echo "Bye bye!"
      break
      ;;
  esac
done

输出:

1) 显示所有元素 2) 添加元素 3) 加载文件             
4) 写入文件 5) 生成行 6) 清除文件            
7) 清除元素 8) 选择文件 9) 退出                  
#?

答案2

您可以设置COLUMNS,请参阅 bash 手册页。

COLUMNS
    Used  by the select compound command to determine the terminal width when 
    printing selection lists. Automatically set if the checkwinsize option is 
    enabled or in an interactive shell upon receipt of a SIGWINCH.
#!/bin/bash

COLUMNS=X

select item in {a..f}; do
    # ...
done

# COLUMNS=20
# 1) a  3) c  5) e
# 2) b  4) d  6) f 

# COLUMNS=15
# 1) a  4) d
# 2) b  5) e
# 3) c  6) f

相关内容