我已经有了这个脚本,但它不起作用。我认为这是因为它无法评估 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
正如其他答案所指出的,(...)
表示子外壳。算术扩展是((...))
,所以如果bash
你应该使用((...))
or[[
或 POSIXly [
。可以((
这样使用:
$ if ((1==1)); then echo "YES" ;fi
YES
但请注意,在 的情况下[[
,==
运算符表示模式匹配,即不是算术比较。
或者,如果您确实想==
在 POSIX shell 中使用运算符,可以执行以下操作:
$ 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 shell 中,/bin/sh
没有((
运算符,但有$((
,它会扩展为算术表达式的结果。其中的比较运算符以类似于 C 的方式运行,其中 1 表示正确结果,0 表示错误结果(与通常的 shell 方式相反,其中 0 表示成功,非零表示失败)。
答案3
if(a == b)
不是整数比较的正确语法此外,您调用时x
没有指示它是变量,因此您(尝试)将 的值$WIDTH
与文字 string进行比较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
解释:
- 中,赋值时
bash
不要加空格;=
例如x=123
,不是x = 123
。 - 要比较中的事物
bash
,请使用[[ .. ]]
. xdotool
已经有getwindowgeometry --shell
用于bash
编程了。