如何在菜单列表中有空格或制表符?
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "Your choise is 1"
;;
"Option 2")
echo "Your choise is 2"
;;
"Quit")
break
;;
*) echo "Invalid option;;
esac
done我得到了这个:
[user@Server:/home/user] ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice:但我喜欢这样的东西:
[user@Server:/home/user] ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice:想法?
发布于 2018-12-12 08:20:28
select语句在bash中显示菜单,不允许为菜单指定缩进。
只是对代码的注释:通常让case语句在$REPLY上操作比使用所选字符串的变量更容易。它使您不必输入字符串两次。
例如。
select opt in "${options[@]}"
do
case $REPLY in
1)
echo "Your choice is 1"
;;
2)
echo "Your choice is 2"
;;
3)
break
;;
*) echo 'Invalid option' >&2
esac
done或者,对于这个具体的例子,
select opt in "${options[@]}"
do
case $REPLY in
[1-2])
printf 'Your choice is %s\n' "$REPLY"
;;
3)
break
;;
*) echo 'Invalid option' >&2
esac
done发布于 2018-12-12 22:29:32
手动重新实现select并微调显示并不太困难,至少只要您没有那么多选项需要多列列表。
#!/bin/bash
# print the prompt from $1, and a menu of the other arguments
choose() {
local prompt=$1
shift
local i=0
for opt in "$@"; do
# we have to do the numbering manually...
printf " %2d) %s\n" "$((i += 1))" "$opt"
done
read -p "$prompt: "
}
options=("Foo" "Bar" "Quit")
while choose 'Please enter your choice' "${options[@]}"; do
case $REPLY in
1) echo "you chose 'foo'" ;;
2) echo "you chose 'bar'";;
3) echo 'you chose to quit'; break;;
*) echo 'invalid choice';;
esac
done当然,这可以扩展为将数组键(索引)考虑在内,并将它们作为菜单中的选项来表示,而不是运行计数器。
https://unix.stackexchange.com/questions/487506
复制相似问题