Wie kann man bash sagen, dass es ein Skript zufriedenstellend wiederholen soll, dann das fertige Produkt ausgeben

685
Hellreaver

Ich versuche, diesen Code zu wiederholen, bis ich ihn anhalte. Entweder indem ich eine Zeit einstelle, für die er sich wiederholt, ^ c drückt oder die Anzahl der Iterationen einstellt und dann das Ergebnis der Wiederholung ausgibt. Der Code sollte in sich selbst eingespeist werden, so dass bei der ersten Eingabe der Variablen 5 und 2 das Skript mit 5 und 2.25 als Variablen neu gestartet wird. Das Skript hilft mit einer Vermutung, die Quadratwurzel einer Zahl zu bestimmen.

#!/bin/bash echo -n "Please enter the number you need to find the square root for and press [ENTER]: " read fin echo -n "Please enter guess and press [ENTER]: " read gues var=$(echo "$fin/$gues" | bc -l ) var1=$(echo "$var+$gues" | bc -l ) var2=$(echo "$var1/2" | bc -l ) echo $var2 
2

1 Antwort auf die Frage

2
nKn

Sie müssten diesen Code in eine Endlosschleife schreiben, wie zum Beispiel:

while 1; do # Rest of code ... done 

Um zu stoppen, wenn Ctrl+ Cgetroffen wird, ist das, was Sie tatsächlich tun, ein Signal abzufangen (konkret SIGINT). Sie müssen a definieren, trapdamit es ausgelöst wird, wenn Sie diese Tastenkombination drücken.

Für weitere Informationen über Fallen, können Sie sich auch hier, das eine schließt SIGINTBeispiel und wie Sie etwas nach dem Fang es drucken.

trap [BEFEHLE] [SIGNALE]

Dadurch wird der Trap-Befehl angewiesen, die aufgelisteten SIGNALS abzufangen. Dies können Signalnamen mit oder ohne SIG-Präfix oder Signalnummern sein. Wenn ein Signal 0 oder EXIT ist, werden die BEFEHLE ausgeführt, wenn die Shell beendet wird. Wenn eines der Signale DEBUG ist, wird die Liste der BEFEHLE nach jedem einfachen Befehl ausgeführt. Ein Signal kann auch als ERR angegeben werden. In diesem Fall werden COMMANDS jedes Mal ausgeführt, wenn ein einfacher Befehl mit einem Status ungleich Null beendet wird. Beachten Sie, dass diese Befehle nicht ausgeführt werden, wenn der Exit-Status ungleich Null von einem Teil einer if-Anweisung oder von einer while- oder einer bis-Schleife stammt. Sie werden auch nicht ausgeführt, wenn ein logisches AND (&&) oder OR (||) zu einem Exit-Code ungleich Null führt oder wenn der Rückkehrstatus eines Befehls mit dem! Operator.

Ich nehme an, dass die Endekombination der Tasten optional ist oder möglicherweise so eingestellt ist, dass der Code für eine festgelegte Anzahl von Sekunden ausgeführt wird Hellreaver vor 8 Jahren 0
Es fängt eigentlich SIGNALs ab. Wenn Sie also ein von bash erkanntes Signal generieren können, ist dies in Ordnung. Dies wäre der Fall von Strg + C, das zwar ein "SIGINT" für das Skript erzeugt, aber nicht alle * Kombinationen erzeugen ein Signal. Sie können einem Skript jedoch ein beliebiges Signal von einem anderen Bash-Skript senden, aber dazu müssten Sie die PID des empfangenden Bash-Skripts kennen, was mühsam sein kann. Sie können auch X-Iterationen (mit einer Variable, die zählt, wie oft sie ausgeführt wurde) in der Schleife ausführen und dann die Schleife beenden. nKn vor 8 Jahren 1
Eine festgelegte Anzahl klingt nach einer perfekten Übereinstimmung für das, was ich brauche Hellreaver vor 8 Jahren 0