如果,elif,其他声明在Bash中发布

Stu*_*ing 328 bash if-statement

我似乎无法弄清楚以下if陈述的问题是关于elifthen.请记住,printf仍然在开发中我还没有能够在声明中测试它,所以很可能是错误的.

我得到的错误是:

./timezone_string.sh: line 14: syntax error near unexpected token `then'
./timezone_string.sh: line 14: `then'
Run Code Online (Sandbox Code Playgroud)

声明就是这样.

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
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 420

elif和之间缺少空格[:

elif[ "$seconds" -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

应该

elif [ "$seconds" -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

正如我看到这个问题获得了很多观点,重要的是要指出要遵循的语法是:

if [ conditions ]
# ^ ^          ^
Run Code Online (Sandbox Code Playgroud)

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

  • 括号需要空格的原因是因为它们只是实际程序的快捷方式(至少是第一个括号,第二个是我所理解的语法糖).要理解它,请参阅左括号的实际联机帮助页:`$ man [` (31认同)
  • [是测试命令的一种别名。这就是为什么需要空白字符的原因。`if test“ $ seconds” -eq 0; then ... fi`等同于`if [“ $ seconds” -eq 0]; then ... fi]`。@LeiYang`man test`是您真正想要的 (3认同)
  • 这个帖子不应该因为错字而被关闭吗? (2认同)
  • @ zx8754本来可以,但不是成为解决此错误的规范方法,它看起来非常有用(360K视图和计数)。 (2认同)
  • 我的一些同事不了解“空间”或“编码样式”的概念,因此这可能不是拼写错误。 (2认同)

anu*_*ava 278

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

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,这是我在stackexchange上很容易找到的唯一完整且简单的*`bash`"if-then-else"构造...谢谢. (62认同)
  • @ Chinggis6真的,我身边的话语选择不好. (6认同)
  • @Camusensei这不是一个完全废话,因为`sh`可以用来代替更高的兼容性(不是所有的*nix发行版都有[tag:bash]作为默认的shell(有些有ksh或者灰烬,但是大多数都依赖于标准的` sh` to function).此外,如果脚本中没有使用bash的特定或高级功能,那么'sh'应该用作解释器(它的另一个原因),因为它可以自己处理脚本. (4认同)
  • @ Chinggis6总废话,翻译**可能是`#!/ bin/sh`但不必. (3认同)

cho*_*oba 23

[是一个命令.它必须用前面语句中的空格分隔:

elif [
Run Code Online (Sandbox Code Playgroud)

  • 它由内置的bash取代,但是您的信息仍然正确。使用`type -a [`可以看到。 (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我建议您看看bash中的调理基础知识。

符号“ [”是命令,并且必须在其前面有一个空格。如果您在Elif之后不留空格,则系统会将Elif [解释为一个特定命令,这绝对不是您现在想要的命令。

用法:

elif(A COMPULSORY WHITESPACE WITHOUT PARENTHESIS)[(A WHITE SPACE WITHOUT PARENTHESIS)conditions(A WHITESPACE WITHOUT PARENTHESIS)]
Run Code Online (Sandbox Code Playgroud)

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

elif [ "$seconds" -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

没有任何编译错误,您会很好。您的最终代码段应如下所示:

#!/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
Run Code Online (Sandbox Code Playgroud)