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 mittest
,[ .. ]
oder[[ .. ]]
;(
..)
bedeutet Sub-Shell -
Die Zuweisung erfolgt ohne Leerzeichen.
x = 1920
ruft den Befehlx
mit den Parametern=
und . Verwenden Sie stattdessenx=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:
- Setzen Sie in
bash
keine Leerzeichen um=
, wenn Werte zuweisen; Beispielx=123
, nichtx = 123
. - Zum Vergleichen von Dingen in
bash
Verwenden Sie[[ .. ]]
. -
xdotool
hat bereitsgetwindowgeometry --shell
fürbash
Programmierung.
Kommentare
- -1 | Denn Sie haben
eval
und`
unnötig
verwendet