Wie vergleiche ich Zahlen in Bash?

Ich habe dieses Skript, aber es funktioniert nicht. Ich denke, es liegt daran, dass der Zahlenvergleich in der if-Anweisung nicht ausgewertet werden kann.

#!/bin/bash { read __ WIDTH; read __ HEIGHT; read __ __ BORDER_WIDTH; } < <(xwininfo -id "$(xdotool getactivewindow)" | grep -o -e "Height:.*" -e "Width:.*" -e "Border width:.*") echo "Height: $HEIGHT, Width: $WIDTH, Border width: $BORDER_WIDTH" x = 1920 if($WIDTH == x) then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi 

Wie kann ich das beheben?

Kommentare

  • Verwenden Sie geeignete numerische Vergleiche – -eq für gleich usw.
  • Wenn Sie ' bin mit einer oder mehreren der Antworten zufrieden, stimme ihnen zu. Wenn Sie Ihr Problem lösen, ist das Akzeptieren die beste Möglichkeit, " Danke zu sagen! " Das Akzeptieren einer Antwort zeigt zukünftigen Lesern auch an, dass die Antwort das Problem tatsächlich gelöst hat.

Antwort

Es gibt verschiedene Probleme mit dem Skript:

  • bash Tests werden entweder durchgeführt mit test, [ .. ] oder [[ .. ]]; ( .. ) bedeutet Sub-Shell

  • Die Zuweisung erfolgt ohne Leerzeichen. x = 1920 ruft den Befehl x mit den Parametern = und . Verwenden Sie stattdessen x=1920.

  • Variablennamen muss ein Dollarzeichen vorangestellt werden, wenn Sie sie verwenden. == x ist also schlecht und == $x ist gut. (Außer bei arithmetischen Auswertungen oder Erweiterungen: (( ... )) oder $(( ... )), dank Kommentar von Kusalananda ).

  • Zahlen sollten mit -eq, = dient zum Vergleich von Zeichenfolgen. In Ihrem Fall sollte es auch funktionieren, da die Zahlen wahrscheinlich identisch gespeichert werden. Es ist jedoch besser, den konzeptionell korrekten Operator zu verwenden. == ist ein nicht standardmäßiges Äquivalent zu =.

  • Sie sollten sich daran gewöhnen, Variablen nach Möglichkeit überall doppelt zu zitieren, um beispielsweise das Globbing zu verhindern.

Ich werde nur die Zeilen ab x = 1920 korrigieren. Die feste Version lautet:

x=1920 if [ "$WIDTH" -eq "$x" ] then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi 

Kommentare

  • Zu Ihrem dritten Punkt: Außer bei arithmetischen Auswertungen oder Erweiterungen: (( ... )) oder $(( ... )).

Antwort

Wie andere Antworten vermerkten, (...) zeigt eine Unterschale an. Die arithmetische Erweiterung lautet ((...)). Im Fall von bash sollten Sie ((...)) oder [[ oder POSIXly [. Die (( kann wie folgt verwendet werden:

$ if ((1==1)); then echo "YES" ;fi YES 

Beachten Sie jedoch, dass im Fall von [[, der Operator == zeigt die Musterübereinstimmung an, dh es handelt sich nicht um einen arithmetischen Vergleich.

Wenn Sie den Operator == mit der POSIX-Shell wirklich verwenden möchten, können Sie Folgendes tun:

$ foo=1 $ bar=2 $ if [ $((foo==bar)) -eq 1 ]; then echo "YES"; else echo "NO"; fi NO $ bar=1 $ if [ $((foo==bar)) -eq 1 ]; then echo "YES"; else echo "NO"; fi YES 

Im Fall der POSIX-Shell /bin/sh gibt es keinen (( -Operator, jedoch gibt es $((, das sich zum Ergebnis eines arithmetischen Ausdrucks erweitert. Die darin enthaltenen Vergleichsoperatoren wirken C-ähnlich, wobei 1 ein wahres Ergebnis und 0 ein falsches Ergebnis anzeigt (im Gegensatz zur üblichen Shell-Methode) (0 ist Erfolg und Nicht-Null ist Fehler).

Antwort

if(a == b) ist nicht die richtige Syntax für einen Ganzzahlvergleich. Außerdem rufen Sie x auf, ohne anzugeben, dass es sich um eine Variable handelt. Sie versuchen also, den Wert von $WIDTH mit der Literalzeichenfolge x. Versuchen Sie stattdessen:

if [[ $WIDTH -eq $x ]] 

Kommentare

  • Zitieren Sie Ihre Variable. Die Zuordnung zu x ist genauso fehlerhaft.
  • Wenn ich Variablen in [[ [...] ]] -Konstrukten zitiere, wird mir dies mitgeteilt ' muss nicht. Wenn ich nicht ' t bin, wird mir gesagt, ich sollte. Ich kann nicht gewinnen.
  • -1 | Denn Sie haben [[ .. ]] verwendet, wenn dies nicht erforderlich ist. In einem solchen Fall sollte ein gewöhnlicher Testbefehl verwendet werden.
  • @Vlastimil was auch immer für? Dies ist ein Bash-Skript. Es gibt ' keinen Grund, [ überhaupt zu verwenden.
  • Wenn Sie ' Wenn Sie bash verwenden, gibt es buchstäblich keinen Grund, jemals das Konstrukt [ [...] ] zu verwenden, das sowohl eine Teilmenge als auch anfälliger ist Fehler aufgrund von PICNIC-Problemen.

Antwort

Versuchen Sie Folgendes:

# use xrandr+sed to get current screen width screenWidth=`xrandr|sed -En "/connected [0-9]+x[0-9]+/{s/^.*connected ([0-9]+)x[0-9]+.*$/\1/;p}"` # use xdotool getwindowgeometry --shell to get size/pos of window eval `xdotool getactivewindow getwindowgeometry --shell` echo $screenWidth $WIDTH # debug, to see values got from xrandr and xdotool if [[ $WIDTH = $screenWidth ]]; then wmctrl -r :ACTIVE: -b toggle,maximized_vert,maximized_horz else xdotool key Ctrl+F12 fi 

Erläuterung:

  1. Setzen Sie in bash keine Leerzeichen um =, wenn Werte zuweisen; Beispiel x=123, nicht x = 123.
  2. Zum Vergleichen von Dingen in bash Verwenden Sie [[ .. ]].
  3. xdotool hat bereits getwindowgeometry --shell für bash Programmierung.

Kommentare

  • -1 | Denn Sie haben eval und ` unnötig

verwendet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.