如何在 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

该脚本存在几个问题:

  • bash测试可以用test,[ .. ][[ .. ]];完成(..)表示子外壳

  • 赋值时不带空格,将调用带有参数和 的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

正如其他答案所指出的,(...)表示子外壳。算术扩展是((...)),所以如果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

解释:

  1. 中,赋值时bash不要加空格;=例如x=123,不是x = 123
  2. 要比较中的事物bash,请使用[[ .. ]].
  3. xdotool已经有getwindowgeometry --shell用于bash编程了。

相关内容