【问题标题】:Bash if then else syntax [duplicate]Bash if then else 语法[重复]
【发布时间】:2018-11-21 20:20:33
【问题描述】:

我正在尝试使用 if then else 语句使用 bash 脚本进行测试自动化,但我遇到了一些错误。一方面,当我尝试执行它时,我对 j 和 k 的变量赋值做错了,因为它告诉我在我尝试执行时找不到命令 j 和命令 k。如何正确创建变量? 最令人困惑的事情是,当我尝试执行脚本时,我收到一个错误,告诉我我在 fi 附近有一个意外的令牌,然后它只是说'fi'。我在这里做错了什么?

#!/bin/bash

j = 0
k = 0

echo Test1:
echo -ne "0\nIn\nUG\n" | /u/cgi_web/Tuition/cost
echo Test2:
echo -ne "0\nOut\nUG\n" | /u/cgi_web/Tuition/cost
echo Test3:
echo -ne "0\nIn\nGR\n" | /u/cgi_web/Tuition/cost
echo Test4:
echo -ne "0\nOut\nGR\n" | /u/cgi_web/Tuition/cost

for i in {1..17}
do
    echo Test$((i+4)):
if[ "$j" -eq 0 ] && [ "$k" -eq 0 ] then
    $j = 1
    echo -ne "$i\nIn\nUG\n" | /u/cgi_web/Tuition/cost
elif[ "$j" -eq 1 ] && [ "$k" -eq 0 ] then
    $k = 1
    echo -ne "$i\nIn\nGR\n" | /u/cgi_web/Tuition/cost
elif[ "$j" -eq 1 ] && [ "$k" -eq 1 ] then
    $j = 0
    echo -ne "$i\nOut\nUG\n" | /u/cgi_web/Tuition/cost
elif[ "$j" -eq 0 ] && [ "$k" -eq 1 ] then
    $k = 0
    echo -ne "$i\nOut\nGR\n" | /u/cgi_web/Tuition/cost
fi

done

编辑:我发现 j 和 k 的变量问题,我必须删除语句中的空格。

【问题讨论】:

  • j = 0 -> j=0, k = 0 -> k=0
  • if's 之后还需要空格。
  • 请看:shellcheck.net

标签: bash syntax-error


【解决方案1】:

Bash if 语句在 then 之前需要一个分号:

if [ condition ] || [ condition ]; then
    # code
elif [ condition ] && [ condition ]; then
    # code
fi

例如。

【讨论】:

  • ...当然是换行符。
  • 技术上不准确。事实上,我更喜欢不带分号的换行符。
【解决方案2】:

为了帮助将来可能会寻求帮助的任何人,我想我会用我在自己的测试中发现的所有语法错误以及其他人的有用回答来回答我自己的问题。 开始变量赋值:

j = 0

中间不能有空格,所以应该是:

j=0

此外,if 语句在 if 和括号之间需要一个空格,并且在此之前的最后一个括号之后需要一个分号。因此我的 if 语句不正确

if[ "$j" -eq 0 ] && [ "$k" -eq 0 ] then

变成

if [ "$j" -eq 0 ] && [ "$k" -eq 0 ]; then

或者你可以在括号之间换一个新行来代替分号,所以它会变成

if [ "$j" -eq 0 ] && [ "$k" -eq 0 ]
then

【讨论】:

  • 在许多语言中,通常可以添加或删除空格以提高可读性而不改变含义。但在 shell 语法中,情况并非如此。在 shell 中,空格是重要的分隔符,添加或删除它们会改变命令的含义,有时会以意想不到的方式。在测试表达式中,每个元素之间需要空格。在任务中,它们是被禁止的。有几个地方可以选择空格,但很少见。