Inkrement einer variable Wert innerhalb einer while-Schleife in ein shell-Skript
Ich versuche Inkrementieren einer variable Wert in einer while-Schleife, aber ich erhöhen wollen es zweimal. Von "zweimal" ich meine Inkrement-variable mit dem Wert zum ersten mal, dann tun Sie etwas Betrieb und erhöhen Sie bereits Inkrementierte Wert einmal mehr, und dies alles innerhalb einer while-Schleife. Mein code sieht wie folgt aus:
i=1
setglobal="SET GLOBAL "
while [ $i -le $# ]
do
assign=$setglobal$i=$($i+1)
START=`date +%s`
mysql $database -u $user -se "$assign;select
here goes my database query, not important"
END=`date +%s`
echo $END - $START | bc>>output.txt
i=$(($i+1))
mysqld restart
done
Und ich haben eine Liste von Argumenten an meine shell: innodb_change_buffer_max_size 16 key_buffer_size 1431655770, als 1., 2., 3. und 4. Argumente beziehungsweise. Also ich will die while-Schleife zu tun:
SET GLOBAL innodb_change_buffer_max_size = 16
nach
assign=$setglobal$i=$($i+1)
und
SET GLOBAL key_buffer_size = 1431655770
nach
i=$(($i+1))
assign=$setglobal$i=$($i+1)
Als ein Ergebnis, in meinem output.txt ich sollte bekam die Laufzeit der einzelnen Abfragen, aber ich bekomme nur vier Nullen. Also ich denke, meine Schleife ist entweder nicht tun, diesen Teil "SET GLOBAL key_buffer_size = 512" richtig, oder es nicht tun, die richtige Schrittweite. Könnte mir jemand sagen, was falsch sein könnte mit meinem code?
InformationsquelleAutor user3344382 | 2014-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich, dass mysql Lesen kann Befehle von der Standardeingabe, lesbarer als ein
single-double-quoted string.
Wenn Sie bash 4, ich würde den Prozess der Argumente wie diese:
Vorausgesetzt, Sie können mehrere sql-global in einer Sitzung:
InformationsquelleAutor glenn jackman
glenn jackman ' s hilfreiche Antwort bietet
bash
Lösungen.Jedoch gegeben haben, dass Sie allgemein tagged Ihre Frage
shell
und, dass der code scheint nur für die Verwendung von POSIX-konforme Funktionen (außer Fehler), gehe ich davon aus, dass Sie sich für ein POSIX-konforme Lösung:Als für , was Sie versucht haben,:
$($i+1)
nicht funktionieren, da ein Verweis auf die$i
-TEN Positionsparameter:$(...)
ist ein Substitutionen (das moderne äquivalent des`...`
), die erweiterte Ergebnis$i+1
würde tatsächlich interpretiert werden, als eine Befehl zu führen, das ist nicht die Absicht.Verwendung von POSIX-Funktionen, die nur, es gibt keinen direkten Weg von verweisen auf einen Positionsparameter durch index.
bash
könnten Sie${@:i:1}
, aber das ist eine nicht standardisierte Erweiterung).Daher der einfachste Ansatz ist die Verwendung von
shift
zu verbrauchen Parameter (entfernen Sie von Anfang an von dem array von Parametern) nach dem speichern Ihre Werte in Variablen, und dann überprüfen, ob alle Links sind mit[ $# -gt 0 ]
. Dies kann auch entfällt die Notwendigkeit für zusätzliche index-Variablen -$i
.Während
echo $END - $START | bc
funktioniert, es gibt keine Notwendigkeit, externe Dienstprogrammbc
, weil einfache arithmetische expansion$(( END - START ))
tun.Es ist am besten zu vermeiden Variablennamen wie
$START
und$END
, denn allen-groß-shell-Variablen-Namen können Konflikt mit Umwelt-Variablen und spezielle shell-Variablen.InformationsquelleAutor mklement0