406

我似乎无法弄清楚以下if语句与elifand相关的问题是什么then。请记住,printf它仍在开发中,我只是无法在声明中对其进行测试,因此很可能是错误的。

我得到的错误是:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'

声明是这样的。

if [ "$seconds" -eq 0 ];then
   $timezone_string="Z"
elif[ "$seconds" -gt 0 ]
then
   $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
else
   echo "Unknown parameter"
fi
4

5 回答 5

496

elif和之间缺少一个空格[

elif[ "$seconds" -gt 0 ]

应该

elif [ "$seconds" -gt 0 ]

总之,要遵循的语法是:

if [ conditions ]; then
   # Things
elif [ other_conditions ]; then
   # Other things
else
   # In case none of the above occurs
fi

我看到这个问题得到了很多关注,重要的是要指出要遵循的语法是:

if [ conditions ]
# ^ ^          ^

这意味着括号周围需要空格。否则,它将无法正常工作。这是因为[它本身就是一个命令。

您没有看到类似elif[: command not found(或类似)的原因是在看到ifand之后then,shell 正在寻找elif,elsefi. 但是它找到了另一个then(在错误格式化之后elif[)。只有elif[: command not found解析完语句后,它才会被执行(并且会输出一条错误消息)。

于 2013-04-16T10:34:25.817 回答
337

您的脚本存在一些语法问题。这是一个固定版本:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi
于 2013-04-16T10:36:11.753 回答
27

[是一个命令(或某些 shell 中的内置命令)。它必须与前面的语句用空格分隔:

elif [
于 2013-04-16T10:35:02.307 回答
8

我建议您看一下 bash 中的调节基础知识。

符号“[”是一个命令,它前面必须有一个空格。如果您在 elif 之后没有给出空格,系统会将elif[解释为一个特定的命令,这绝对不是您目前想要的。

用法:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]

简而言之,将您的代码段编辑为:

elif [ "$seconds" -gt 0 ]

没有编译错误就可以了。您的最终代码段应如下所示:

#!/bin/sh    
if [ "$seconds" -eq 0 ];then
       $timezone_string="Z"
    elif [ "$seconds" -gt 0 ]
    then
       $timezone_string=`printf "%02d:%02d" $seconds/3600 ($seconds/60)%60`
    else
       echo "Unknown parameter"
    fi
于 2018-12-10T19:34:54.960 回答
6

程序之间缺少空格elif[休息是正确的。你需要纠正它并检查一下。这是固定程序:

#!/bin/bash

if [ "$seconds" -eq 0 ]; then
   timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
   timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
   echo "Unknown parameter"
fi

与此bash if else 语句相关的有用链接

于 2020-01-20T06:32:15.133 回答