ChatGPT解决这个技术问题 Extra ChatGPT

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

我似乎无法弄清楚以下 if 语句对于 elifthen 的问题。请记住,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
我想知道为什么我们需要 ifelif 中的 then 语句而不是 else 中的语句,而且一般情况下也是如此。
@w17t,因为我们需要将条件与序列分开。
@codeforester我看不到将500K视图问题标记为与只有5K视图问题重复的太多逻辑
使用一些代码自动格式化工具可能会通过自动添加/删除括号周围的空格来帮助您。您可以为您的编辑器搜索插件。
对我来说,我从没想过在“if”语句的末尾有一个分号,然后是“then”。你的问题本身就是我的解决方案。非常感谢 !!

P
PatchingMatching

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(或类似内容)的原因是,在看到 ifthen 之后,shell 正在寻找 elifelsefi。但是它会找到另一个 then(在格式错误的 elif[ 之后)。只有 解析了语句之后才会执行(并且会输出像 elif[: command not found 这样的错误消息)。


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

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

#!/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”的构造...谢谢。
缩进是可选的。解释器可以(并且应该)是 #!/bin/sh
@Chinggis6 胡说八道,解释器可以#!/bin/sh,但不是必须的。
@Camusensei 这不是胡说八道,因为可以使用 sh 来提高兼容性(并非所有 *nix 发行版都有 bash 作为默认外壳(有些有 ksh 或 ash,但它们中的大多数确实依赖于标准 sh此外,如果脚本中没有使用 bash 的特定或高级功能,那么应该使用“sh”作为解释器(这是另一个原因),因为它可以自行处理脚本。
@Chinggis6 是的,我这边选词不好。
c
choroba

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

elif [

它被 bash 中的内置函数取代,但您的消息仍然正确。使用 type -a [ 来查看。
它也是一个对我来说总是很奇怪的二进制文件。
M
Mr. Weirdo

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

J
John Walsh

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 statement 相关的有用链接