Shell 'if(…)'then'中缺少分号并且没有语法错误?
有人指出了一个简单shell脚本中缺少的分号,我很好奇为什么它没有抛出语法错误 完整脚本:Shell 'if(…)'then'中缺少分号并且没有语法错误?,shell,if-statement,syntax,Shell,If Statement,Syntax,有人指出了一个简单shell脚本中缺少的分号,我很好奇为什么它没有抛出语法错误 完整脚本: interval () { INTERVAL="$*" WHEN_TO_RUN=0 while read LINE; do if (( $(epoch 0S) >= $WHEN_TO_RUN )) then echo $LINE WHEN_TO_RUN="$(epoch $INTERVAL)" f
interval () {
INTERVAL="$*"
WHEN_TO_RUN=0
while read LINE; do
if (( $(epoch 0S) >= $WHEN_TO_RUN )) then
echo $LINE
WHEN_TO_RUN="$(epoch $INTERVAL)"
fi
done
}
有关行:
if (( $(epoch 0S) >= $WHEN_TO_RUN )) then
我也不明白为什么帕伦夫妇会这样做,而我通常期望:
if [ $(epoch 0S) -ge $WHEN_TO_RUN ]; then
在OSX上,if relevant是一个取自ksh的“算术命令”扩展,允许在shell脚本中使用C风格的数学语法(POSIX将$(…)
指定为扩展语法;(…)
作为命令语法是扩展的元素)。因此,它的目标是与ksh的实现兼容——毫无疑问,它是一个独立的命令,以)
结尾。不像[
——一个没有特殊解析时间处理的常规命令[1]——它在语法上是重要的(解析器必须在内部有不同的行为)((
,因此需要知道它),所以解析器知道算术命令何时结束
在bash 2.05之前,命令分隔符是必需的,即使在条件上下文中也是如此。但是,这与上游ksh实现不兼容,因此bash被修改为在此上下文中显式不需要分隔符
[1] -
[
在bash中确实有一个内置的实现,但它只在命令分派时参与,而不是在解析时参与。(
是语法,而[
是常规命令(为了性能,有一个内置的实现,但语义相当于一个外部工具);解析器对它们的处理方式有所不同……一般来说,这并不特定于if
语句,而是特定于(())
…请参见与先前存在的SO问题密切相关的一个问题(对于更一般的主题,而不是命令分隔符语法)..re:all caps namespace,请参阅,记住shell和环境变量共享一个名称空间:包含小写字母的环境变量名称的名称空间为应用程序保留。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准uti的行为但是,是的,shell(不幸的)与JavaScript具有相同的设计缺陷,即变量是全局的,除非另有明确声明。(顺便说一句,ksh函数functname的起源){
语法是,当第一次在ksh中实现时,当在这样定义的函数中用类型声明变量时,默认情况下,它使变量成为局部变量,而用普通POSIX样式类型声明的函数声明全局变量;然而,在bash中,函数
与POSIX complia相比没有任何好处nt语法)。