コマンドを入力した後にスクリプトファイルを初期プロンプトに戻すにはどうすればよいですか? (ループ含む)? [閉鎖]

コマンドを入力した後にスクリプトファイルを初期プロンプトに戻すにはどうすればよいですか? (ループ含む)? [閉鎖]

たとえば、次のコードがあります。

#!/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

3番目の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

ドア自体がループなので(ただではなく)ループをbreak 2終了する必要があります。この文字列は、ユーザーが誤った選択を入力した場合にのみ表示されます(ここで作成された方法)。whilebreakselectPress Enter to redisplay menu

breakステートメント内の内容は、プログラムが外部ループで再び終了し、すぐに再実行されるようにselectします(メニューを再表示)。これは、ユーザーがメニューからオプションを選択した場合に発生します。whileselectinfo

答え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

関連情報