我正在阅读Bash中的选择菜单:
Making menus with the select built-in
在迭代菜单中的选项时我很困惑,并希望得到任何反馈。
在此处使用代码作为起点:
How can I create a select menu in a shell script?
我们得到以下输出:
#!/bin/sh
git --work-tree=/var/www/domain.com --git-dir=/var/repo/site.git checkout -f
我想尝试做的是,一旦选择了一个选项,再次显示选择选项,因此输出将如下:
root@dev:~/# ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 1
you chose choice 1
Please enter your choice: 2
you chose choice 2
Please enter your choice: 4
root@dev:~/#
所以我给了它一个Bash(L)并尝试循环选项(数组?):
root@dev:~/# ./example.sh
1) Option 1
2) Option 2
3) Quit
Please enter your choice: 1
you chose choice 1
1) Option 1
2) Option 2
3) Quit
Please enter your choice: 2
you chose choice 2
1) Option 1
2) Option 2
3) Quit
Please enter your choice: 3
root@dev:~/#
但后来我得到了一个输出:
#!/bin/bash
PS3='Please enter your choice: '
options=("Option 1" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
# Create an incrementing value
loop=1;
# Loop through each option
for option in ${options[@]} ; do
# Echo the option
echo "$loop) $option";
# Increment the loop
loop=$((loop+1));
done
;;
"Quit")
break
;;
*) echo invalid option;;
esac
done
所以看起来这里的数组值是用空格分隔的吗?
根据我的理解:root@dev:~/# ./stumped.sh
1) Option 1
2) Quit
Please enter your choice: 1
you chose choice 1
1) Option
2) 1
3) Quit
Please enter your choice:
正在创建一个包含2个值而不是3个值的数组,但它在Bash中被解释为3并且我不确定原因。
有人可以启发并解释为什么会这样吗?
答案 0 :(得分:1)
让我们创建一个显示菜单的function
并回应用户的选择:
function show_menu {
select option in "${OPTIONS[@]}"; do
echo $option
break
done
}
现在,我们可以将function
包装在一个循环中,并且只有在用户选择Quit
时才会中断:
while true; do
option=$(show_menu)
if [[ $option == "Quit" ]]; then
break
fi
done
瞧!
答案 1 :(得分:0)
如果希望每次迭代显示编号选项,请选择为您执行此操作。
options=("Option one" "two" three "and number four" quit)
while true; do
select item in "${options[@]}" ; do
if [ -n "${item}" ]; then
break
fi
echo "Sorry, please enter a number as shown."
break
done;
if [[ "${item}" = "quit" ]]; then
break
fi
if [ -n "${item}" ]; then
echo "Your answer is ${item}"
fi
done