たとえば、次のコードがあります。
#!/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
終了する必要があります。この文字列は、ユーザーが誤った選択を入力した場合にのみ表示されます(ここで作成された方法)。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