Hvordan sammenligner jeg tal i bash?

Jeg har dette script, men det fungerer ikke. Jeg tror, at det ikke evaluerer sammenligningen af tal i if-sætningen.

#!/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 

Hvordan kan jeg løse dette?

Kommentarer

  • Brug korrekte numeriske sammenligninger – -eq for lige osv.
  • Hvis du ' er tilfredse med et eller flere af svarene, opstem dem. Hvis man løser dit problem, ville acceptere det være den bedste måde at sige " Tak! " Accept af et svar indikerer også for fremtidige læsere, at svaret faktisk løste problemet.

Svar

Der er flere problemer med scriptet:

  • bash test er enten udført med test, [ .. ] eller [[ .. ]]; ( .. ) betyder underskal

  • Tildeling foretages uden mellemrum, x = 1920 kalder kommandoen x med parametrene = og 1920. Brug x=1920 i stedet.

  • Variabelnavne skal have forud for et dollartegn, når du bruger dem. Så == x er dårlig, og == $x er godt. (Undtagen inden for aritmetiske evalueringer eller udvidelser: (( ... )) eller $(( ... )) takket være kommentar fra Kusalananda ).

  • Tal skal sammenlignes med -eq, = er til strengesammenligning. I dit tilfælde skal det også fungere, da tallene sandsynligvis gemmes identisk, men det er bedre at bruge den konceptuelt korrekte operator. == er en ikke-standardækvivalent med =.

  • Du skal vænne dig til at dobbeltkaste variabler overalt, når det er muligt, hvilket forhindrer globbing f.eks. >

Jeg retter bare linierne startende fra x = 1920, den faste version er:

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

Kommentarer

  • Om dit tredje punkt: Undtagen inden for aritmetiske evalueringer eller udvidelser: (( ... )) eller $(( ... )).

Svar

Som andre svar bemærkede, (...) angiver subshell. Aritmetisk udvidelse er ((...)), så i tilfælde af bash skal du bruge ((...)) eller [[ eller POSIXly [. (( kan bruges som sådan:

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

Bemærk dog, at i tilfælde af [[, == -operatøren angiver mønstermatchning, dvs. det er ikke aritmetisk sammenligning.

Alternativt, hvis du virkelig vil bruge == operatør med POSIX shell, kan man gøre følgende:

$ 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 

I tilfælde af POSIX-shell /bin/sh er der ingen (( operatør, men der er $((, der udvides til resultatet af et aritmetisk udtryk. Sammenligningsoperatorer inden for det handler på en C-lignende måde, hvor 1 angiver et sandt resultat, og 0 angiver et falsk resultat (i modsætning til den sædvanlige shell-måde , hvor 0 er succes, og ikke-nul er fejl).

Svar

if(a == b) er ikke den korrekte syntaks til en heltalesammenligning Derudover påkalder du x uden at angive, at det er en variabel, så du (prøver at) sammenligne værdien af $WIDTH med den bogstavelige streng x. Prøv i stedet:

if [[ $WIDTH -eq $x ]] 

Kommentarer

  • Citér din variabel. Opgaven til x er lige så buggy.
  • Når jeg citerer variabler i [[ [...] ]] konstruktioner, får jeg at vide, at jeg behøver ikke '. Når jeg ikke ' t, får jeg at vide, at jeg burde. Jeg kan ikke vinde.
  • -1 | For du har brugt [[ .. ]] når det ikke er nødvendigt. Almindelig testkommando skal bruges i et sådant tilfælde.
  • @Vlastimil hvad til? Dette er et bash-script. Der er ' overhovedet ingen grund til at bruge [.
  • Hvis du ' ved brug af bash er der bogstaveligt talt ingen grund til nogensinde at bruge [ [...] ] -konstruktionen, som både er en delmængde og mere tilbøjelig til fejl på grund af PICNIC-problemer.

Svar

Prøv dette:

# 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 

Forklaring:

  1. I bash skal du ikke sætte mellemrum (r) omkring = tildeling af værdier eksempel x=123, ikke x = 123.
  2. For at sammenligne ting i bash, brug [[ .. ]].
  3. xdotool har allerede getwindowgeometry --shell til bash programmering.

Kommentarer

  • -1 | For du har brugt eval og ` unødvendigt

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *