このスクリプトはすでに存在しますが、機能しません。 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
このスクリプトにはいくつかの問題があります。
bash
test
テストは、[ .. ]
またはで実行してサブシェルを表すことができます[[ .. ]]
。(
)
x = 1920
スペースなしで割り当てると、パラメーターとを含むコマンドが呼び出されます。代わりに使用してください。x
=
1920
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
答え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
説明する:
- たとえば、noなどのように割り当てるときに
bash
スペースを追加しないでください。=
x=123
x = 123
- の内容を比較するには
bash
を使用します[[ .. ]]
。 xdotool
すでにプログラミングgetwindowgeometry --shell
に使用されていますbash
。