2017-01-17 2 views
1

Ich arbeite an einer audiovisuellen Kunstinstallation mit einem Raspberry Pi mit Raspbian Jessie. Das Audio oder Video wird nach dem Login über ein Bash-Skript gestartet. Dieses Skript läuft alleine gut.Integer wird als Variable interpretiert

Mein Problem war mit dem Versuch zu planen, die Schleife nur zu bestimmten Zeiten des Tages mit einer if-Anweisung ausgeführt werden. Dies wurde am Anfang der Schleife platziert, um die Zeit zu überprüfen, bevor eine neue Datei gestartet wird. am Anfang des Skripts

HOUR=$(date +"%H") 
echo "The hour is $HOUR" 
if [ $HOUR -gt 22 || $HOUR-lt 8 ] 
then 
     sleep 60 
     continue 
fi 

Ich habe HOUR als eine ganze Zahl mit declare -i HOUR erklärt.

Das Skript gibt diesen Fehler aus und fährt dann fort.

./start_audio.sh: line 49: 13: command not found 

Ich glaube, dass der Variable richtig eingestellt ist, weil $HOUR [13] in dem Fehler angezeigt wird. Warum wird also $hour als Befehl interpretiert, wenn es als Integer deklariert wurde?

Erprobte Änderungen wie Hinzufügen von Anführungszeichen oder Entfernen von Leerzeichen, wie Antworten auf andere Fragen vorgeschlagen haben.

+0

können Sie das gesamte Skript posten? – Mox

+1

[Shellcheck] (http://www.shellcheck.net) erkennt automatisch viele dieser Probleme. –

Antwort

3

Legen Sie Ihre Variablen in doppelte Anführungszeichen (hier nicht erforderlich, aber als allgemeine Best Practice) und und die Kontrollen trennen sich in zwei mit einem || dazwischen (-o meist veraltet):

if [ "$HOUR" -gt 22 ] || [ "$HOUR" -lt 8 ] 

Alternativ können Sie [[ ]] verwenden:

if [[ "$HOUR" -gt 22 || "$HOUR" -lt 8 ]] 
+1

'-o' ist im Wesentlichen veraltet; Verwende zwei Befehle '[...] || [...] stattdessen. – chepner

3

die Schale builtin [ (test) oder die externe ein unterstützt keine Kurzschlussauswertung Betreiber in ihrem Konstrukt.

Sie müssen die bash Schlüsselwort verwenden, [[:

[[ $HOUR -gt 22 || $HOUR -lt 8 ]] 

Oder die Logik in zwei Teile brechen:

[ $HOUR -gt 22 ] || [ $HOUR -lt 8 ] 

Während wir gerade dabei sind, sollten Sie Ihre variable Erweiterungen zitieren zu verhindern Wortteilung und Pfadnamenerweiterung:

[ "$HOUR" -gt 22 ] || [ "$HOUR" -lt 8 ] 

Ich habe angenommen, dass $HOUR-lt 8 ein Tippfehler ist, wie es $HOUR -lt 8 sein sollte.

+0

Quoting wird nicht schaden, aber ich denke nicht, dass es etwas hinzufügt: Wenn die HOUR-Variable Leerzeichen enthalten soll (erfordert Quoting), dann werden die -gt und -lt-Operatoren auch mit hässlichen Ergebnissen scheitern. Wenn der date -Befehl nicht vertrauenswürdig ist, um nur Ziffern zurückzugeben, muss er vor dem Vergleich geprüft werden. – Fred

+0

@Fred Betrachten Sie 'HOUR = 'foo -o 3'. Wenn Sie '$ HOUR' nicht angeben, dann ist' ['trotz' $ HOUR' keine Ganzzahl, ganz zu schweigen von weniger als 8 oder mehr als 22. – chepner

+0

Wahr. Ich benutze immer doppelte Klammern [[]], die diesem Problem nicht ausgesetzt sind, und ich habe die Wortaufteilung vergessen, die mit dem Befehl zum Testen einzelner Klammern ausgeführt wurde. – Fred

1

Ich glaube nicht, dass Sie den || Operator in einem Standardtest [ ] verwenden können.

Versuchen Sie, || durch -o zu ersetzen, oder verwenden Sie die doppelt geklammerte [[ ]]-Bedingung (bash-spezifisch).

+0

'-o' ist vor langer Zeit veraltet. – heemayl

+0

Ich bin wirklich kein Experte, dies zu verstehen, aber -o scheint ein Teil der POSIX-Spezifikation für den "Test" -Befehl ... Ich wäre überrascht, wenn bash diesen Operator für seine interne eingebaute Version veraltet hätte (siehe http: // pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) – Fred

+0

'-o' ist eine Erweiterung der POSIX-Spezifikation, die als veraltet gilt. Neuer Code sollte es nicht verwenden. – chepner

Verwandte Themen