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 

これを修正するにはどうすればよいですか?

コメント

  • 適切な数値比較を使用する-等しい場合は-eqなど。

1つまたは複数の回答に満足し、賛成してください。問題を解決している場合は、受け入れるが"ありがとうございます!"回答を受け入れることは、将来の読者に、その回答が実際に問題を解決したことも示します。

回答

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

  • bashテストが実行されますtest[ .. ]または[[ .. ]]を使用。 ( .. )はサブシェルを意味します

  • 割り当てはスペースなしで行われます。 x = 1920は、パラメーター=およびivid = “e62778bbb6を使用して、コマンドxを呼び出します。 “>

。代わりにx=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 

    コメント

    • 3番目のポイントについて:算術評価または展開内を除く:(( ... ))または$(( ... ))

    回答

    他の回答に記載されているように、(...)はサブシェルを示します。算術展開は((...))であるため、bashの場合は、((...))または[[、またはPOSIXly [((は次のように使用できます。

    $ 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は成功、ゼロ以外は失敗です。

    回答

    if(a == b)は整数比較の適切な構文ではありませんさらに、変数であることを示さずにxを呼び出すため、$WIDTH文字列x。代わりに試してください:

    if [[ $WIDTH -eq $x ]] 

    コメント

    • 変数を引用します。 xへの割り当ても同様にバグがあります。
    • [[ [...] ]]構造で変数を引用すると、次のように言われます。 'する必要はありません。 'しないと、そうすべきだと言われます。勝てません。
    • -1 |必要のないときに[[ .. ]]を使用したため。このような場合は、通常のテストコマンドを使用する必要があります。
    • @Vlastimil何のために?これはbashスクリプトです。 'を使用する理由はまったくありません。[
    • ' bashを使用している場合、サブセットであり、より傾向のある[ [...] ]構造を使用する理由は文字通りありません。 PICNICの問題による障害。

    回答

    試してみてください:

    # 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. bashで、=の周囲にスペースを入れないでください。 値の割り当て; 例x=123x = 123ではありません。
    2. bash[[ .. ]]を使用します。
    3. xdotoolにはすでにgetwindowgeometry --shellがあります bashプログラミング。

    コメント

    • -1 | eval`を不必要に使用したため

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です