Bash if语句总是转到else

Bash if语句总是转到else,bash,scripting,Bash,Scripting,我刚开始学习Bash脚本,我必须做一个程序,将一个位图图像分隔为两个(图像已损坏),我已经在web上找到了如何编写循环和语句 但我不知道为什么我的if语句总是指向else。 if是模2,等于0 下面是下面的代码 #!/bin/sh OUTPUT="$(hexdump -v -e '/1 "%02X\n"' merge.bmp)" echo $OUTPUT vars=0 count=1 touch one touch two for i in $OUTPUT do if (($v

我刚开始学习Bash脚本,我必须做一个程序,将一个位图图像分隔为两个(图像已损坏),我已经在web上找到了如何编写循环和语句 但我不知道为什么我的if语句总是指向else。 if是模2,等于0 下面是下面的代码

#!/bin/sh
OUTPUT="$(hexdump -v -e '/1 "%02X\n"' merge.bmp)"
echo $OUTPUT
vars=0
count=1
touch one
touch two
for i in $OUTPUT
    do 
    if (($vars%2==0))
    then
        echo "1"
    else
        echo "2"
    fi
    vars=$((vars+count))
done
在终端中,出现以下错误:

./q3.sh: 14: ./q3.sh: 2885%2==0: not found 

2

我真的不知道为什么
如果
总是打印
2

shebang行是错误的,应该是:

#!/bin/bash

((表达式))
是一个
bash
扩展,在
sh
中不可用。shebang行是错误的,它应该是:

#!/bin/bash

((表达式))
是一个
bash
扩展,在
sh
中不可用
/bin/sh
版本的
(())
bash是:

if test $(($vars % 2)) -eq 0; then
   echo "1"
   ...
fi
由于
$(())
知道变量名,因此您甚至可以放弃美元并编写

if test $((vars % 2)) -eq 0; then
   echo "1"
   ...
fi

(())
巴什主义的
/bin/sh
版本如下:

if test $(($vars % 2)) -eq 0; then
   echo "1"
   ...
fi
由于
$(())
知道变量名,因此您甚至可以放弃美元并编写

if test $((vars % 2)) -eq 0; then
   echo "1"
   ...
fi

你在shebang中使用了
/bin/sh
,但是
(…)
是一种巴什主义。改用
/bin/bash
。@BenjaminW。谢谢,但是为什么shebang很重要(现在代码正在工作),但是为什么他现在正在工作?@SnirSudri,
/bin/sh
只保证兼容POSIX的shell<代码>$(())
是POSIX标准的一部分,但
(())
不是。请参阅@CharlesDuffy谢谢,我将在几分钟后阅读此内容。您在shebang中使用
/bin/sh
,但
(…)
是一种巴什主义。改用
/bin/bash
。@BenjaminW。谢谢,但是为什么shebang很重要(现在代码正在工作),但是为什么他现在正在工作?@SnirSudri,
/bin/sh
只保证兼容POSIX的shell<代码>$(())
是POSIX标准的一部分,但
(())
不是。请参阅@CharlesDuffy中的“选择您的外壳”部分谢谢,我将在几分钟后阅读此内容