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[
查看它。它也是一个二进制文件,对我来说总是很奇怪。