例如,我有代码:
#!/bin/sh
echo "Please enter function: \c"
read ANS
case $ANS in
author)
echo "John"
;;
在脚本响应我的名字后,如何让脚本返回到初始提示(请输入函数)?
答案1
你可能想要类似的东西
#!/bin/sh
while true; do
printf 'Say something: ' >&2
read -r something
case $something in
quit) break ;;
info) echo 'There is no info' ;;
*) echo 'Invalid input' >&2
esac
done
echo 'Bye!'
这是典型的读取操作类型的循环。它是无限的,但用户可以通过键入 退出它quit
。每次操作后,系统都会提示用户进行另一次输入。
或者,使用bash
:
#!/bin/bash
while read -p 'Say something: ' -r something; do
case $something in
quit) break ;;
info) echo 'There is no info' ;;
*) echo 'Invalid input' >&2
esac
done
echo 'Bye!'
这将允许用户Ctrl+D在提示时按 退出循环,或者进入quit
。
第三种方式bash
,
#!/bin/bash
PS3='Select something: '
while true; do
select something in 'info' 'quit'; do
case $something in
quit) break 2;;
info) echo 'There is no info'
break ;;
*) echo 'Invalid input' >&2
esac
echo 'Press Enter to redisplay menu' >&2
done
done
echo 'Bye!'
在此变体中,向用户呈现一种菜单以从中选择内容。每次操作后,菜单都会重新显示。用户通过选择退出quit
。使用的提示文本select
取自PS3
shell 变量。
需要break 2
退出while
循环(而不仅仅是break
),因为select
语句本身就是一个循环。Press Enter to redisplay menu
仅当用户输入无效选择(此处的书写方式)时才会显示该字符串。
break
语句内的任何内容select
都会导致程序退出回到外while
循环,然后立即select
再次执行(重新显示菜单)。如果用户info
从菜单中选择选项,就会发生这种情况。
答案2
使用 while 循环:
#!/bin/sh
while :; do
read -rp 'Please enter function: '
case $REPLY in
author)
echo "John"
;;
esac
done
这将运行直到用户输入我不推荐的中断序列。至少我会确保有一个退出选项:
#!/bin/sh
while :; do
read -rp 'Please enter function: '
case $REPLY in
author)
echo "John"
;;
exit)
break
;;
esac
done
另一个选项(如果 bash 可用)是选择菜单:
#!/bin/bash
PS3='Select a function: '
select FUNC in author publisher release_date exit; do
case $FUNC in
author)
echo 'John'
;;
publisher)
echo 'Penguin'
;;
release_date)
echo '1996'
;;
exit)
break 2
;;
*)
echo 'ERROR! Unknown selection' >&2
;;
esac
done