我正在 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