2016-05-03 5 views
0

Ich bin auf den Fehler gestoßen, den ich von einem Skript bekomme, das ich ausführen möchte, um meinen Rechner auszusetzen. Ich versuche, eine Regex in einer Elif-Anweisung zu verwenden, um meine Maschine nach einer bestimmten Zeit zu unterbrechen.bash Regulärer Ausdruck in if-Anweisung

#!/bin/bash 
echo "When would you like to suspend the machine?" 
read "sustime" 
if [ "$sustime" = "now" ] 
then 
    sudo pm-suspend 
elif [[ "$sustime" =~ [0-9]*[smhd] ]] 
then 
    time=`expr "$sustime" : '\([0-9]+)\)'` 
    ttype=`expr "$sustime" : '.*\([smhd]\)'` 
    sudo sleep $time$ttype ; sudo pm-suspend 
else 
    echo "Please enter either [now] or [#s|m|h|d]" 
fi 

Der Code funktioniert nicht auf der elif Linie, zum Beispiel, wenn ich Eingang 5s, die Ausgabe des Skripts ist:

$ sh dbussuspend.sh 
When would you like to suspend the machine? 
5s 
dbussuspend.sh: 10: dbussuspend.sh: [[: not found 
Please enter either [now] or [#s|m|h|d] 

Es sollte jedoch gelesen, dass ich eingegeben habe die String 5s Führen Sie den Codeblock unter elif. Ich habe tatsächlich jeden Regex anstelle von [0-9]*[smhd] versucht, alle mit dem gleichen Fehler.

+1

Randbemerkung: Sie wahrscheinlich wollen Sie [0-9] + [smhd] 'sonst wird' h' eine akzeptable Eingabe sein. – Laurel

+0

Sie brauchen 'expr' nicht; Sie können Capture-Gruppen im ursprünglichen regulären Ausdruck verwenden und dann auf die erfassten Werte aus dem Array "BASH_REMATCH" zugreifen. – chepner

Antwort

6

dieses Problem wird nicht durch das Skript verursacht, sondern wie Sie es sind Aufruf:

sh dbussuspend.sh 

sein sollte:

bash dbussuspend.sh 

bash wissen, wie [[, aber sh nicht ...

besser noch, tun wie Gordon Davisson schlägt vor. Tun Sie dies einmal:

chmod +x dbussuspend.sh 

und von da, rufen Sie wie folgt aus:

./dbussuspend.sh 

zusätzlich Etan Reisner und chepner Frage der Nutzung von expr und laurel Ihre bash regex. GNU Coreutils sleep unterstützt z.B. sleep 30s, sleep 2m, sleep 1h. Überprüfen Sie dies auf Ihrem System mit man sleep. wenn ja, dann wird diese Arbeit:

elif [[ "$sustime" =~ ^[0-9]+[smhd]$ ]] 
then 
    sudo sleep $sustime ; sudo pm-suspend 

(^ und $ in ^[0-9]+[smhd]$ den Anfang und das Ende der Zeichenfolge entsprechen und "uzeifue 1s ziufzr" passend zum Beispiel verhindern.)

+0

Verwenden Sie nicht 'expr'. Vor allem, wenn es so aussieht, als ob Sie das tun, um die Eingabe zu teilen und dann einfach sofort wieder zusammenzusetzen. –

+1

Noch besser als explizit 'bash' zu verwenden, sollten Sie das Skript mit' chmod + x dbussuspend.sh' ausführen lassen (wenn es nicht schon ist), dann führen Sie es mit './Dbussuspend.sh' aus, damit es gehorcht die Shebang-Linie (die schon '/ bin/bash' ist, wie es sein sollte). –

+1

Omg Ich liebe diese Website. Vielen Dank an alle, wirklich klar für mich. – chepurko