Shell 条件错误 - Bash 语法无法识别

Shell conditional errors out - Bash syntax not recognized

我有一点 shell 脚本,似乎无法弄清楚如何创建简单的条件语句。

big_width=$(($width > 1700))
big_height=$(($height > 1700))

if [ $extension != "jpg" || $big_width || $big_height ]; then

给出错误

[: missing ]
0: not found

如果这能给我我想要的,我也知道。如果 $extension != "jpg 或 width/height 变量之一大于 1700,则应执行条件。

编辑

尝试此代码 if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then 得到 height: not found error。知道为什么 bash 语法会出错吗?

编辑

当我将它添加到我的脚本时

echo [=14=]
echo $SHELL

它打印

source/images/shrink_img.sh
/bin/bash

所以 bash 应该可以正常工作?我不知道为什么这种条件语法会破坏事物。我尝试将文件扩展名从 .sh 更改为 .bash 并使用 bash 而不是 sh 调用脚本。

在 C 语言中,您可以在需要布尔表达式的地方放置 01。在 shell 脚本中并非如此。您也不能在单个方括号内使用 &&||。他们需要在外面。

选项 1:明确写下所有三个测试。

if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then

选项 2: 使用 "boolean" 个变量。

((big_width  = width  > 1700))
((big_height = height > 1700))

if [[ $extension != "jpg" ]] || ((big_width)) || ((big_height)); then    

选项 3:隐藏函数后面的测试。

big_width () { ((width  > 1700)); }
big_height() { ((height > 1700)); }

if [[ $extension != "jpg" ]] || big_width || big_height; then

(您会注意到我切换到双方括号。[[ ... ]][ ... ] 更可靠。请参阅 this answer 以深入了解双括号的优势.)

or运算符为-o,需要使用比较-eq 0:

big_width=$(($width > 1700))
big_height=$(($height > 1700))

if [ $extension != "jpg"  -o  $big_width -eq 0  -o  $big_height -eq 0 ]; then

如果我对问题的理解正确,这段代码就可以解决问题。想换个条件也可以玩玩

    width=1701
    height=1699
    extension="jpg"

    if [ $extension != "jpg" ] || [ $width -gt 1700 ] || [ $height -gt 1700 ]; 
    then
        echo "Yay"
    else
        echo "Nay"
    fi