シェルスクリプト:大文字と小文字を入力しながら「qを入力して終了」を追加します。

シェルスクリプト:大文字と小文字を入力しながら「qを入力して終了」を追加します。

私はシェルスクリプトを書いています:

#!/bin/bash

i=1;
sp="/-\|";
no_config=true;
echo "type \"continue\" to exit this while loop";
echo "if you feel the conditions for continuing sucessfully have been met... ";
while $no_config;
do printf "\b${sp:i++%${#sp}:1}";
[[ ! $(pidof SupremeCommande) && -f ~/My\ Documents/newfile ]] && no_config=false;
sleep 1;
done;
# do more stuff

これで、ユーザーが開始したループ終了も追加したいと思います。

複雑に見えますね。

当初、私はこれを見つけて希望を高めました。 https://unix.stackexchange.com/a/228152/228658 ただし、読み取りコマンドの実行が停止したことがわかりました。

私はこれをしたくありません。私はいつでも「q」を押すと終了しますが、上下にスクロールする機能を妨げないマニュアルページのようなものが欲しいです。バックグラウンドで入力を慎重に待っています。

シェルスクリプトでこれをどのように達成できますか?

ベストアンサー1

より簡単な解決策は、ユーザーにCtrl-Cループ終了を押してSIGINTシグナルを送信し、スクリプトを終了するように指示することです。

スクリプトを終了する前に他のタスクを実行するには、次の信号をキャッチできます。

cleanup() {
  # ...
  exit 0
}
trap 'cleanup' INT

あるいは、サブシェルでシェルの 1 つを実行して、シェルの 1 つがシャットダウンした場合、他のシェルもシャットダウンすることもできます。これにより、入力の1つをブロックし、他の入力は異なるチェックを実行できます。

#!/bin/bash

i=1
sp="/-\|"
no_config=true
echo "type \"continue\" to exit this while loop if you feel the conditions for continuing sucessfully have been met... "
(
while $no_config
do 
  printf "\b${sp:i++%${#sp}:1}"
  [[ ! $(pidof SupremeCommande) && -f ~/My\ Documents/newfile ]] && no_config=false
  sleep 1
done
kill $$
) &
child_pid=$!

while $no_config
do
  read -r typed_continue
  [[ "$typed_continue" = "continue" ]] && no_config=false
  sleep 1
done
kill $child_pid

おすすめ記事