Bashで数値を比較するには?

Bashで数値を比較するには?

このスクリプトはすでに存在しますが、機能しません。 if文では数値比較を評価できないからだと思います。

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

この問題をどのように解決できますか?

答え1

このスクリプトにはいくつかの問題があります。

  • bashtestテストは、[ .. ]またはで実行してサブシェルを表すことができます[[ .. ]]()

  • x = 1920スペースなしで割り当てると、パラメーターとを含むコマンドが呼び出されます。代わりに使用してください。x=1920x=1920

  • 変数名の前にはドル記号を付ける必要があります。だから== xそれは悪くも良い== $xものでもある。 (算術評価または拡張除外:(( ... ))または$(( ... ))、コメントをお寄せいただきありがとうございます。先行は達成するのが難しい)。

  • -eq=文字列を比較するには、数字を、と比較する必要があります。あなたの場合でも、数字は同じ方法で保存されるため、うまく機能しますが、概念的に正しい演算子を使用する方が良いでしょう。==非標準等価物です=

  • 変数を引用するときは、可能であれば二重引用符を使用することに慣れる必要があります。たとえば、これによりワイルドカードを使用できなくなります。

で始まる行を修正しますx = 1920。修正されたバージョンは次のとおりです。

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

答え2

他の答えで指摘したように、(...)サブシェルを表します。算術拡張を使用できる((...))ため、ORまたはPOSIXlyをbash使用する必要があります。次のように使用できます。((...))[[[((

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

ただし、[[演​​算子==は算術比較ではなくパターンマッチングを表します。

==あるいは、実際にPOSIXシェルで演算子を使用するには、次のようにします。

$ 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

POSIXシェルには演算子/bin/shはありませんが、算術式の結果に拡張される演算子が((あります。$((比較演算子は C と同様の方法で動作します。ここで、1は正しい結果を表し、0は無効な結果を表します(0は成功を表し、0以外は失敗を表す一般的なシェル方式とは対照的です)。

答え3

if(a == b)整数比較の正しい構文ではありません。また、変数であることを示さずに呼び出すので、x値をリテラル文字列と$WIDTH比較したいと思いますx。次に変更してみてください。

if [[ $WIDTH -eq $x ]]

答え4

この試み:

# 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

説明する:

  1. たとえば、noなどのように割り当てるときにbashスペースを追加しないでください。=x=123x = 123
  2. の内容を比較するにはbashを使用します[[ .. ]]
  3. xdotoolすでにプログラミングgetwindowgeometry --shellに使用されていますbash

関連情報