如果,ifif,否则Bash中的语句问题


358

我似乎无法弄清楚以下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

7
我想知道为什么我们需要thenifelif而不是)中else以及一般情况下使用该语句。

@ w17t,因为我们需要将条件与序列分开。
Sasha

3
@codeforester我认为将500K视图问题标记为仅5K视图问题的逻辑并不多
fedorqui'SO stop harm'19年

使用一些代码自动格式化工具可以通过自动在方括号内添加/删除空格来帮助您。您可以为您的编辑器搜索插件。
Nj Subedi

Answers:


453

elif和之间缺少空格[

elif[ "$seconds" -gt 0 ]

应该

elif [ "$seconds" -gt 0 ]

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

if [ conditions ]
# ^ ^          ^

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

为什么你没有看到类似的原因elif[: command not found(或类似)是在看到ifthen,壳要么寻找elifelsefi。但是,它会找到另一个then(格式错误的elif[)。只有解析了该语句之后,它才会被执行(并且elif[: command not found将输出一条错误消息,例如)。


33
方括号需要空格的原因是因为它们只是实际程序的快捷方式(至少第一个方括号,第二个方括号只是我理解的语法糖)。为此,请参阅左括号的实际手册:$ man [
Michael Johansen

3
这个帖子不应该因为错字而被关闭吗?
zx8754

3
@ zx8754本来可以,但不是成为解决此错误的规范方法,它看起来非常有用(360K视图和计数)。
fedorqui'SO停止伤害'18

3
我的一些同事不了解“空间”或“编码样式”的概念,因此这可能不是拼写错误。
juzzlin

3
[是测试命令的一种别名。这就是为什么需要空白字符的原因。if test "$seconds" -eq 0; then ... fi等同于if [ "$seconds" -eq 0 ];then ... fi ]。@LeiYang man test是您真正要寻找的东西
Melicerte

303

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

#!/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

76
奇怪的是,这是我在stackexchange上很容易找到的唯一完整且简单的 bash “ if-then-else”构造……谢谢。
通配符

1
缩进是可选的。口译员可以(并且应该)是#!/bin/sh

3
@ Chinggis6完全是胡说八道,解释器可能#!/bin/sh但不是必须的。
Camusensei

4
@Camusensei并不是一个完全废话,sh可以使用它来获得更高的兼容性(并非所有* nix发行版都将bash作为默认shell(有些具有ksh或ash,但其中大多数确实取决于功能的标准sh)。此外,如果bash特定于或先进的功能是不是在脚本,然后“上海”应作为解释(一个原因,它)所使用,因为它可以由自己来处理脚本。

6
@ Chinggis6是对的,我这边的单词选择不好。
Camusensei

25

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

elif [

3
它由内置的bash取代,但是您的信息仍然正确。使用type -a [一看就知道。
Camusensei

这也是一个二进制文件,对我来说总是很奇怪。
佐格先生

4

我建议您看看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

2

程序之间缺少空格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语句相关的有用链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.