3
#!/bin/sh
INTERVAL=1
COUNT=0
while [ $COUNT -le 9 ]
do
    (( COUNT++ ))
    sleep $INTERVAL
    echo "count is $COUNT"
done

在执行。

$ sh ascript 
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
count is 0
ascript: 9: COUNT++: not found
4

7 回答 7

8

如果您想使用特定于 bash 的操作,您可能想要#!/bin/bash而不是在顶部。#!/bin/sh

您的脚本在我的 Mac 上运行良好,sh实际上只是bash. 如果你sh是一个真正的人,你可能不会那么幸运。

于 2012-04-09T02:54:32.820 回答
8

(( ))将是一个嵌套子shell(实际上是其中两个),并调用了 command COUNT++。你想要$(( ))算术替换机制;但这实际上会替换,因此您要么想将其隐藏在注释中,要么使用涉及替换的增量。

: $(( COUNT++ )) # : is a shell comment

或者

COUNT=$(( $COUNT + 1 ))
于 2012-04-09T02:55:24.470 回答
3
#!/bin/bash
COUNT=0;
while [ $COUNT -le 9 ] ; 
do sleep 1; 
(( COUNT++ )) ; 
echo $COUNT ; 
done

这是编写此脚本的更好方法。我建议您按以下方式运行脚本:
./script.sh

bash ./script.sh

如果您没有 bash,请使用以下方式:

#!/bin/sh
ENV=1
while [ $ENV -le 10 ]
do
sleep 1
echo $ENV
ENV=`expr $ENV + 1`
done
于 2014-03-05T15:35:55.813 回答
2

来自help for

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
    Arithmetic for loop.

    Equivalent to
        (( EXP1 ))
        while (( EXP2 )); do
                COMMANDS
                (( EXP3 ))
        done
    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is
    omitted, it behaves as if it evaluates to 1.


    Exit Status:
    Returns the status of the last command executed.

不要忘记使用bash.

于 2012-04-09T02:56:38.893 回答
0

这:(( COUNT++ ))不做你想做的事。

改成:let "COUNT++"

有关bash 中算术运算的更多信息,请参见:http ://tldp.org/LDP/abs/html/ops.html。

而且,要使用 bash,请使用#!/bin/bash而不是#!/bin/sh

于 2012-04-09T02:55:57.110 回答
0

我的给我这个错误只是因为我尝试用 sh (例如 sh code.sh)执行它,但是当我这样做时./code.sh它起作用了。

于 2017-07-14T18:50:15.173 回答
0

当使用顺序重命名文件来增加变量时,从更改#!/bin/sh#!/bin/bash对我来说就像一个梦想。count++

当我也得到时,原始脚本开始#!/bin/sh在 Fedora 中运行良好,但在 Kali (Debian) 中却不行

计数++:未找到

简单地替换#!/bin/sh#!/bin/bash解决这个问题 - 大概是因为 Kali/Debian 中的默认 shell 不是 bash。这与我认为在配置使用破折号的 Kali 时必须更改默认 shell 一致。

于 2017-07-25T20:27:18.033 回答