Bash中的if、elif、else语句问题

Bash中的if、elif、else语句问题,bash,if-statement,Bash,If Statement,我似乎无法找出以下语句的问题所在,如果语句与elif和有关,那么。请记住,printf仍在开发中,我只是无法在声明中测试它,所以很可能是错误的 我得到的错误是: /timezone\u string.sh:第14行:意外标记“then”附近的语法错误 ./timezone_string.sh:第14行:`then' 声明是这样的 if [ "$seconds" -eq 0 ];then $timezone_string="Z" elif[ "$seconds" -gt 0 ] then

我似乎无法找出以下
语句的问题所在,如果
语句与
elif
有关,那么
。请记住,
printf
仍在开发中,我只是无法在声明中测试它,所以很可能是错误的

我得到的错误是:

/timezone\u string.sh:第14行:意外标记“then”附近的语法错误
./timezone_string.sh:第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

elif
[
之间缺少空格:

elif[ "$seconds" -gt 0 ]
应该是

elif [ "$seconds" -gt 0 ]

我看到这个问题得到了很多意见,指出以下语法很重要:

if[条件]
# ^ ^          ^
这意味着括号周围需要空格。否则,它将不起作用。这是因为
[
本身是一个命令


您没有看到类似于
elif[:command not found
(或类似)的内容的原因是,在看到
if
then
之后,shell正在查找
elif
else
fi
。但是,它会找到另一个
if
(在错误格式化的
elif[/code>之后)。只有在解析语句后才会执行它(并且会输出错误消息,如
elif[:command not found

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

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中条件反射的基础知识

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

用法:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]
#!/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
简而言之,将代码段编辑为:

elif [ "$seconds" -gt 0 ]
您不会有编译错误。您的最终代码段应该如下所示:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]
#!/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

elif
[
rest之间缺少空格。您的程序是正确的。您需要更正它并将其签出。以下是修复程序:

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

与此相关的有用链接

奇怪的是,这是我在stackexchange上很容易找到的唯一完整且简单的
bash
“if-then-else”构造…谢谢。缩进是可选的。解释器可以(也应该)be
#!/bin/sh
@Chinggis6完全是胡说八道,解释器可以是
#!/bin/sh
,但不必如此。@Camusensei这不是胡说八道,因为
sh
可以用于更高的兼容性(并非所有*nix发行版都有默认shell)(有些有ksh或ash,但大多数都依赖标准
sh
来运行)。此外,如果脚本中没有使用bash的特定或高级功能,则应使用“sh”作为解释器(还有一个原因)因为它可以自己处理脚本。@Chinggis6是真的,在我这方面用词不好。括号需要空格的原因是因为它们只是实际程序的快捷方式(至少第一个括号,第二个括号是我理解的语法糖)。要理解它,请参阅左括号的实际手册:
$man[
这篇文章不应该因为打字错误而关闭吗?@zx8754本来可以,但它并没有成为修复这个错误的标准方法,它看起来非常有用(360K视图和计数)。我的一些同事不理解“空格”或“编码样式”的概念,所以这可能不是打字错误。[这是测试命令的一种别名。这就是为什么需要空白字符。<代码>如果测试“$s”-eq 0;那么…Fi < /代码>相当于<代码> [ [ $s] -eq 0 ];然后…Fi]
@LeiYang
人测试
是你真正想要的。我想知道为什么我们需要
if
elif
中的
语句,但不在
else
中,也不在一般情况下。@w17t,因为我们需要将条件和顺序分开。@codeforester我看不到将一个500K问题标记为复制到一个只有5个字符的版本。使用一些代码自动格式化工具可以自动添加/删除括号中的空格。你可以为编辑器搜索插件。对我来说,我从来没有想到“if”语句后面会有一个分号,后面跟着“then”。你的问题本身就是我的解决方案。非常感谢!!这是超级的由bash中的内置程序调用,但您的消息仍然正确。请使用
键入-a[
查看它。它也是一个二进制文件,对我来说总是很奇怪。