我正在学习shell脚本(比Bash shell更关注sh shell),并且编写了一个简单的脚本来测试sh shell中的while语句。
但是当我运行它时,出现此错误...
test.sh: 8: test.sh: 10: not found
10
但是,当我用bash执行脚本时,它运行起来没有问题(即使#!/bin/sh
脚本上有)。有人可以解释为什么吗?两个外壳上的while语句是否不同?
一些注意事项:
通过调试脚本发现了运行脚本的“解决方案”:
bash -x test.sh
权限适用rwx
于我的用户和r
所有其他用户。
改#!/bin/sh
到/bash
但没有真正改变(仍与SH运行它,是非常愚蠢的,我知道,但是有时候愚蠢的事情的工作)。
该代码非常简单明了,它只是一个变量和一个带有该变量回显的while语句,因此我猜没有语法错误(因为它在Bash shell中运行)。
我正在使用Ubuntu 18.04.1 LTS(x86_64)。
脚本所在的目录包含在上$PATH
。
尝试过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] 删除。
我来说两句