![コマンドを入力した後にスクリプトファイルを初期プロンプトに戻すにはどうすればよいですか? (ループ含む)? [閉鎖]](https://linux33.com/image/142057/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%88%9D%E6%9C%9F%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%AB%E6%88%BB%E3%81%99%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%EF%BC%88%E3%83%AB%E3%83%BC%E3%83%97%E5%90%AB%E3%82%80%EF%BC%89%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
たとえば、次のコードがあります。
#!/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