如何比较bash中的数字?

rec*_*ess 1 bash shell-script

我有这个脚本,但它不起作用。我认为这是因为它无法评估 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
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

Wei*_*hou 9

脚本有几个问题:

  • bash测试要么使用test,[ .. ]要么[[ .. ]]; (..)表示子壳

  • 赋值不带空格,x = 1920将调用x带有参数=和的命令1920。使用x=1920来代替。

  • 使用变量名时需要以美元符号作为前缀。所以== x是坏的== $x也是好的。(除了在算术评估或扩展中:(( ... ))or $(( ... )),感谢Kusalananda 的评论)。

  • 数字应该与-eq,进行比较,=用于字符串比较。在您的情况下,它也应该有效,因为数字可能以相同的方式存储,但最好使用概念上正确的运算符。==是一个非标准的等价于=.

  • 如果可能,您应该习惯于在任何地方双引号变量,例如,这可以防止 globbing。

我只修复从 开始的行x = 1920,固定版本是:

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