Beenden Sie die Schleife, wenn eine Taste gedrückt wird

529
BOUABANE Raed

Ich möchte das Skript beenden, wenn eine Taste gedrückt wird.

#!/bin/sh while true; do df -h | head sleep 10 clear done 

Irgendein Vorschlag?

0

3 Antworten auf die Frage

0
kai-dj

Ersetzen sleep 10;durchread -t 10 -n 1 exitwhile; if [ -n "$exitwhile" ]; then break; fi

read -t 10 -n 1 exitwhilewartet 10 Sekunden auf Eingabe ohne Bestätigung mit enter und setzt die Eingabe in den Variablen-Exit. Wenn diese Variable nicht leer ist, wird die while-Schleife unterbrochen.

… Muss jedoch modifiziert werden, da es nur bei Zeichentasten bricht

0
oliv

Sie sollten den watchBefehl besser verwenden :

watch -n10 'df -h | head' 

Verwenden Sie Ctrl+ c, um den Befehl zu stoppen.

Die watchManpage sagt:

watch - führt ein Programm regelmäßig aus und zeigt die Ausgabe im Vollbildmodus

Sie können das ursprüngliche Skript Strg + C drücken. Der Punkt ist die * beliebige * Taste. Kamil Maciorowski vor 5 Jahren 0
0
Kamil Maciorowski

Dies wird bei fast jeder Taste beendet:

#!/bin/bash while true; do { clear; df -h | head; } </dev/null read -n 1 -t 10 && break done; read -t 0.1 -n 1000000 

Anmerkungen:

  • Der Shebang ruft bashnicht shwegen an read -n.
  • Die Umleitung von /dev/nullsoll verhindern, dass andere Befehle ausgeführt werden, als dass readder Standardeintrag erschöpft wird ( clearund dies dfmöglicherweise nicht, aber im Allgemeinen können Befehle befohlen werden). Auf diese Weise gehen alle Eingaben readschließlich an.
  • Das letzte readist, übermäßige Zeichen von stdin zu verwerfen. Einige Schlüssel erzeugen mehr als ein Zeichen (Forschung "Escape-Sequenzen"); Sie können auch mehrere Tasten drücken, während df(oder ein anderer Befehl, den Sie verwenden möchten) ausgeführt wird. Ohne das letzte readZeichen würden diese zusätzlichen Zeichen Ihre Befehlszeile verunreinigen.

Alternativer Ansatz mit watch:

#!/bin/bash watch -n 10 df -h & # put to the background read -n 1 kill $! # kill the the job most recently placed into the background read -t 0.1 -n 1000000