Hvordan sammenligner jeg tall i bash?

Jeg har dette skriptet, men det fungerer ikke. Det er fordi det ikke klarer å evaluere tallsammenligningen i if-setningen, tror jeg.

#!/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 fikse dette?

Kommentarer

  • Bruk riktige numeriske sammenligninger – -eq for lik, etc.
  • Hvis du ' er fornøyd med ett eller flere av svarene, oppstem dem. Hvis en løser problemet ditt, ville godta det være den beste måten å si " Takk! " Å godta et svar indikerer også for fremtidige lesere at svaret faktisk løste problemet.

Svar

Det er flere problemer med skriptet:

  • bash tester er enten gjort med test, [ .. ] eller [[ .. ]]; ( .. ) betyr underskall

  • Oppgave gjøres uten mellomrom, x = 1920 vil ringe kommandoen x med parametrene = og 1920. Bruk x=1920 i stedet.

  • Variablenavn må være foran et dollartegn når du bruker dem. Så == x er dårlig og == $x er bra. (Unntatt innen aritmetiske evalueringer eller utvidelser: (( ... )) eller $(( ... )), takket være kommentar fra Kusalananda ).

  • Tall skal sammenlignes med -eq, = er for strengesammenligning. I ditt tilfelle bør det også fungere siden tallene sannsynligvis blir lagret identisk, men det er bedre å bruke den konseptuelt korrekte operatoren. == er en ikke-standard som tilsvarer =.

  • Du bør venne deg til å doble sitering av variabler overalt når det er mulig, noe som for eksempel forhindrer globbing.

Jeg fikser bare linjene fra x = 1920, den faste versjonen 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 ditt tredje punkt: Unntatt innen aritmetiske evalueringer eller utvidelser: (( ... )) eller $(( ... )).

Svar

Som andre svar bemerket, (...) indikerer subshell. Aritmetisk utvidelse er ((...)), så i tilfelle bash bør du bruke ((...)) eller [[, eller POSIXly [. (( kan brukes slik:

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

Vær imidlertid oppmerksom på at i tilfelle [[, == -operatøren indikerer mønstermatching, dvs. det er ikke aritmetisk sammenligning.

Alternativt, hvis du virkelig vil bruke == operatør med POSIX-skall, kan man gjø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 tilfelle av POSIX-skall /bin/sh er det ingen (( operatør, men det er $((, som utvides til resultatet av et aritmetisk uttrykk. Sammenligningsoperatører i det handler på en C-lignende måte, hvor 1 indikerer et sant resultat, og 0 indikerer et falskt resultat (i motsetning til vanlig shell-måte , hvor 0 er suksess og ikke-null er feil).

Svar

if(a == b) er ikke riktig syntaks for en heltalssammenligning. I tillegg påkaller du x uten å indikere at det er en variabel, så du (prøver å) sammenligne verdien av $WIDTH med bokstavstrengen x. Prøv i stedet:

if [[ $WIDTH -eq $x ]] 

Kommentarer

  • Sitat på variabelen din. Oppgaven til x er like buggy.
  • Når jeg siterer variabler i [[ [...] ]] konstruksjoner, får jeg beskjed om at jeg trenger ikke '. Når jeg ikke ' t, får jeg beskjed om at jeg burde. Jeg kan ikke vinne.
  • -1 | For du har brukt [[ .. ]] når det ikke er nødvendig. Vanlig testkommando bør brukes i et slikt tilfelle.
  • @Vlastimil hva til? Dette er et bash-skript. Det er ' ingen grunn til å bruke [ i det hele tatt.
  • Hvis du ' Når du bruker bash, er det bokstavelig talt ingen grunn til å bruke [ [...] ] -konstruksjonen som både er en delmengde og mer utsatt for feil på grunn av 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, ikke plasser mellomrom = tilordne verdier; eksempel x=123, ikke x = 123.
  2. For å sammenligne ting i bash, bruk [[ .. ]].
  3. xdotool har allerede getwindowgeometry --shell i bash programmering.

Kommentarer

  • -1 | For du har brukt eval og ` unødvendig

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *