2016-07-15 5 views
0

Ich arbeite an einigen Bash-Skript in Linux Ich möchte nur zwei Zahlen zu vergleichen. Eine ist die Plattengröße und eine andere ist die Grenze. Ich erhalte die Festplattengröße von Linux cmd und speichern sie in einer Variablen, wie unten dargestellt,Vergleichen der Ganzzahl mit IF-Bedingung in Bash-Skript

declare -i output  
output= df -h | grep /beep/data| awk '{ printf ("%d",$5)}'  
echo "$output" # Got 80 here 

limit = 80 


if [ $output -eq $limit ]; 
then 
fi 

auf laufend ich die unten Fehlermeldung anzeigt:

line 27: [: -eq: unary operator expected" 
+0

War dies der genaue Code, den Sie lief? Sieht nicht so aus, als hättest du die zweite Zeile überschritten. – Fazlin

+0

Deine 'df'-Zeile sieht gut aus, wie ich aus meinem Testergebnis bestätigen kannst Bist du sicher, dass im ursprünglichen Code keine Leerzeichen um' = 'stehen? – sjsam

+0

Warum Probleme beim Kopieren und Einfügen des eigentlichen Codes? – sjsam

Antwort

4
output= df -h | grep /beep/data| awk '{ printf ("%d",$5)}'  

sollte

output="$(df -h | grep /beep/data| awk '{ printf ("%d",$5)}')" 
#Used command substitution in the previous step 

seine

auch

limit = 80 

sollte

limit=80 # no spaces around =, check all your variables for this 

Nebenbei bemerkt sein: [ command substitution ] und [ shellcheck ] Variablen Skript gibt

+0

eigentlich keinen Platz nur ich hier eingefügt falsch jetzt änderte ich tat aber obwohl ich den gleichen fehler bekomme.Anstatt die Variable zu vergleichen, wenn ich die Integer-Bedingung bearbeite funktioniert wie wenn [80 -eq 80] das funktioniert gut für mich – Gan

+0

@Gan: Tatsächlich haben Sie vielleicht andere Probleme mit dem Skript, überprüfen Sie die bearbeitete Antwort und gucken Sie auf die angegebenen Links die sidennotes :) – sjsam

0

In BASH, es ist nicht notwendig, zu überprüfen, verwenden Sie die Option zu erklären, bevor es zu benutzen, können Sie erklären und weisen Sie Werte im laufenden Betrieb zu, sodass die erste Zeile (declare -i) entfernt werden kann.

Wenn Sie den verwendeten Prozent erhalten möchten, hat "df" eine Option, das zu tun (man df für weitere Informationen). Nach, mit 'grep', können Sie nur die Nummer mit dieser Regexp, beachten Sie, dass ich nur zwei Befehle statt drei verwenden Sie in Ihrem ersten Ansatz.

$ df --output=pcent /beep/data | grep -Eo '[0-9]+' 

Auch für die Ausgabe eines Befehls zu kontrollieren und innerhalb einer Variablen genutzt:

var1=$(put your command with params here) 

Daher wäre die erste Zeile sein:

output=$(df --output=pcent /beep/data | grep -Eo '[0-9]+') 
echo "${output}" 

In BASH gibt Zwischen dem Gleichheitszeichen, dem Namen der Variablen und dem zugewiesenen Wert dürfen keine Leerzeichen stehen.

limit=80 

schließlich für den Vergleich von ganzen Zahlen verwenden doppelte Klammer und Variablen ohne ‚$‘, um den Vergleich zu machen, anstatt doppelte eckigen Klammern.

if ((output >= limit)); then 
    echo 'output is greater or equal than limit' 
fi 

können Sie verwenden für den Vergleich:

== Equal to 
!= Not equal 
> Greater than 
< Less than 
>= Greater or equal 
<= Less or equal 
+0

Wenn Sie genau gleich wollen: ... ((output == limit)) ... –

+0

Gibt es irgendein Problem mit dem ursprünglichen Ansatz BTW? – sjsam

+0

zum Vergleichen von Ganzzahlen verwenden: ((var1 == Wert)), weitere Informationen auf: http://mywiki.wooledge.org/BashGuide. Entfernen Sie auch Leerzeichen in: limit = 80 –

Verwandte Themen