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

时间:2017-10-12 00:26:16

标签: bash shell dash-shell

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

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

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

给出错误

[: missing ]
0: not found

同样IDK,如果这会给我我想要的。如果$extension != "jpg或其中一个宽度/高度变量大于1700,则应执行条件。

修改

尝试此代码if [[ $extension != "jpg" ]] || ((width > 1700)) || ((height > 1700)); then会产生height: not found error。知道bash语法错误的原因吗?

修改

当我将其添加到我的脚本

echo $0
echo $SHELL

打印

source/images/shrink_img.sh
/bin/bash

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

3 个答案:

答案 0 :(得分:2)

在C语言中,您可以将裸01放在需要布尔表达式的位置。在shell脚本中不是这样。您也无法在单个方括号内使用&&||。他们需要在外面。

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

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

选项2:使用“布尔”变量。

((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深入解释双括号的优点。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

如果我正确理解了这个问题,那么这段代码就可以解决问题。如果你想改变条件,你也可以玩。

    width=1701
    height=1699
    extension="jpg"

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