如何让脚本文件在输入命令后返回到其初始提示符?(带循环)?

如何让脚本文件在输入命令后返回到其初始提示符?(带循环)?

例如,我有代码:

#!/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取自PS3shell 变量。

需要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

相关内容