while语句中的奇怪区别(Bash vs sh)

IMN01

我正在学习shell脚本(比Bash shell更关注sh shell),并且编写了一个简单的脚本来测试sh shell中的while语句

但是当我运行它时,出现此错误...

test.sh: 8: test.sh: 10: not found
10

但是,当我用bash执行脚本时,它运行起来没有问题(即使#!/bin/sh脚本上有)。有人可以解释为什么吗?两个外壳上的while语句是否不同?

一些注意事项:

  1. 通过调试脚本发现了运行脚本的“解决方案”:

    bash -x test.sh
    
  2. 权限适用rwx于我的用户和r所有其他用户。

  3. #!/bin/sh/bash但没有真正改变(仍与SH运行它,是非常愚蠢的,我知道,但是有时候愚蠢的事情的工作)。

  4. 该代码非常简单明了,它只是一个变量和一个带有该变量回显的while语句,因此我猜没有语法错误(因为它在Bash shell中运行)。

  5. 我正在使用Ubuntu 18.04.1 LTS(x86_64)。

  6. 脚本所在的目录包含在上$PATH

  7. 尝试过sudo但又一样,在Bash上运行,在sh失败

编辑:

#!/bin/sh

var=10
while [ $var -gt 0 ]
do
        echo $var
        var=$[ $var - 1 ]
done
佩萨

语法的维护者处引用此bug-bash讨论bash$[...]

它可以追溯到1990年的Posix(1003.2d9,我已经丢失了纸质副本)。在伯克利人(主要是马克·特伊特鲍姆)将其放入Posix之后,我实现了它。它最终因支持ksh$((...))扩展而被放弃,这时每个人都弃用了旧的ksh $[...]稍后我将其从手册中删除,但它仍然像往常一样工作。


$[...]是一种不推荐使用的语法,仍然可以使用,bash但不能使用dash/bin/sh根据注释,这是指向系统上的位置)。

dash(符合POSIX)支持以下$((...))语法:

var=10
while [ "$var" -gt 0 ]; do
   echo "$var"
   var=$((var-1))
done

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章