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 –
-eqfü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:
-
bashTests werden entweder durchgeführt mittest,[ .. ]oder[[ .. ]];(..)bedeutet Sub-Shell -
Die Zuweisung erfolgt ohne Leerzeichen.
x = 1920ruft den Befehlxmit den Parametern=und . Verwenden Sie stattdessenx=1920. -
Variablennamen muss ein Dollarzeichen vorangestellt werden, wenn Sie sie verwenden.
== xist also schlecht und== $xist 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
xist 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
bashverwenden, 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:
- Setzen Sie in
bashkeine Leerzeichen um=, wenn Werte zuweisen; Beispielx=123, nichtx = 123. - Zum Vergleichen von Dingen in
bashVerwenden Sie[[ .. ]]. -
xdotoolhat bereitsgetwindowgeometry --shellfürbashProgrammierung.
Kommentare
- -1 | Denn Sie haben
evalund`unnötig
verwendet