Comment comparer des nombres dans bash?

Jai ce script, mais il ne fonctionne pas. Cest parce quil ne parvient pas à évaluer la comparaison des nombres dans linstruction if, je pense.

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

Comment puis-je résoudre ce problème?

Commentaires

  • Utilisez des comparaisons numériques appropriées – -eq pour égal, etc.
  • Si vous ' êtes satisfait dune ou plusieurs des réponses, votez pour les. Si vous résolvez votre problème, laccepter serait la meilleure façon de dire " Merci! " Accepter une réponse indique également aux futurs lecteurs que la réponse a effectivement résolu le problème.

Réponse

Il y a plusieurs problèmes avec le script:

  • bash les tests sont soit effectués avec test, [ .. ] ou [[ .. ]]; ( .. ) signifie sous-shell

  • Les attributions se font sans espaces, x = 1920 appellera la commande x avec les paramètres = et 1920. Utilisez plutôt x=1920.

  • Les noms de variable doivent être précédés dun signe dollar lorsque vous les utilisez. Donc == x est mauvais et == $x est bon. (Sauf dans les évaluations ou extensions arithmétiques: (( ... )) ou $(( ... )), grâce au commentaire de Kusalananda ).

  • Les nombres doivent être comparés à -eq, = est pour la comparaison de chaînes. Dans votre cas, cela devrait également fonctionner car les nombres sont susceptibles dêtre stockés de la même manière, mais il est préférable dutiliser lopérateur conceptuellement correct. == est un équivalent non standard de =.

  • Vous devriez vous habituer à doubler les variables partout lorsque cela est possible, ce qui empêche le globbing par exemple.

Je « vais juste corriger les lignes à partir de x = 1920, la version corrigée est:

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

Commentaires

  • À propos de votre troisième point: sauf dans les évaluations ou extensions arithmétiques: (( ... )) ou $(( ... )).

Réponse

Comme dautres réponses lont noté, (...) indique le sous-shell. Lexpansion arithmétique est ((...)), donc dans le cas de bash vous devriez utiliser ((...)) ou [[, ou POSIXly [. Le (( peut être utilisé comme ceci:

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

Notez cependant que dans le cas de [[, lopérateur == indique une correspondance de modèle, cest-à-dire quil ne sagit pas dune comparaison arithmétique.

Alternativement, si vous voulez vraiment utiliser lopérateur == avec le shell POSIX, on pourrait faire ce qui suit:

$ 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 

Dans le cas du shell POSIX /bin/sh il ny a « pas dopérateur ((, cependant il y a $((, qui se développe au résultat dune expression arithmétique. Les opérateurs de comparaison quelle contient agissent à la manière du C, où 1 indique un résultat vrai et 0 indique un résultat faux (par opposition à la manière habituelle du shell , où 0 est un succès et non nul est un échec).

Réponse

if(a == b) nest pas la syntaxe appropriée pour une comparaison dentiers De plus, vous invoquez x sans indiquer quil sagit dune variable, donc vous (essayez de) comparer la valeur de $WIDTH avec la chaîne littérale x. Essayez à la place:

if [[ $WIDTH -eq $x ]] 

Commentaires

  • Citez votre variable. Laffectation à x est tout aussi boguée.
  • Quand je cite des variables dans des constructions [[ [...] ]], on me dit que je don ' pas obligé. Quand je mets ' t, on me dit que je devrais. Je ne peux pas gagner.
  • -1 | Car vous avez utilisé [[ .. ]] lorsque cela nest pas nécessaire. Une commande de test ordinaire devrait être utilisée dans un tel cas.
  • @Vlastimil pour quoi faire? Ceci est un script bash. Il ny a ' aucune raison dutiliser [ du tout.
  • Si vous ' si vous utilisez bash, il ny a littéralement aucune raison dutiliser la construction [ [...] ] qui est à la fois un sous-ensemble et plus enclin à échec en raison de problèmes de PICNIC.

Réponse

Essayez ceci:

# 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 

Explication:

  1. Dans bash, ne mettez pas despace (s) autour de = lorsque attribuer des valeurs; exemple x=123, et non x = 123.
  2. Pour comparer des éléments dans bash, utilisez [[ .. ]].
  3. xdotool a déjà getwindowgeometry --shell pour bash programmation.

Commentaires

  • -1 | Car vous avez utilisé eval et ` sans nécessité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *