如果块不工作,则bash

如果块不工作,则bash,bash,shell,Bash,Shell,我有下面的代码。这里的逻辑是,如果主机列表包含任何blank条目,它应该将类设置为空,否则它应该是红色的。现在我得到了错误- test.sh[3]:第7行的语法错误:'then'意外 有人能帮我吗?谢谢 #! /bin/bash file=./HostList.txt { echo "<table>" printf "<tr>" if[%s -eq =""]; then clas

我有下面的代码。这里的逻辑是,如果主机列表包含任何blank条目,它应该将类设置为空,否则它应该是红色的。现在我得到了错误-

test.sh[3]:第7行的语法错误:'then'意外 有人能帮我吗?谢谢

     #! /bin/bash
file=./HostList.txt
{
  echo "<table>"
  printf "<tr>"
  if[%s -eq =""]; then
      class="blank"
  else
    class="red"
  fi    
    "<td" $class">%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    <td>%s</td>
    </tr>\n" $(cat "$file"|cut -d'.' -f1)
  echo "</table>"
}  > table.html


exit 0
#/bin/bash
文件=./HostList.txt
{
回声“”
printf“”
如果[%s-eq=”“];则
class=“空白”
其他的
class=“红色”
fi
%s
%
%
%
%
%
%
%
%
%
%
%
%
\n“$(cat“$文件”|剪切-d'.-f1)
回声“”
}>table.html
出口0

Bash对空格非常敏感。这应该起作用:

if [ "%s" = "" ]; then
请注意,
=
用于字符串比较,
-eq
用于整数

编辑:

更准确地说,bash将原始代码拆分为:

if[%s # supposedly a command
-eq # parameter
=""] # parameter
; # end of command
then # keyword

此时,Bash意识到有一个不匹配的
then
关键字,如果[%s(这也会失败),它甚至不会尝试运行

Bash对空格非常敏感。这应该可以:

if [ "%s" = "" ]; then
请注意,
=
用于字符串比较,
-eq
用于整数

编辑:

更准确地说,bash将原始代码拆分为:

if[%s # supposedly a command
-eq # parameter
=""] # parameter
; # end of command
then # keyword

此时,Bash意识到有一个不匹配的
then
关键字,甚至没有尝试运行
if[%s
(这也会失败)。

我不确定HTML标记在那里做什么,但
if
语句应该是这样的:

if [[ $something == "" ]] ; then
    # do something
fi

换句话说,括号和参数之间至少需要一些空格。

我不确定HTML标记在其中做了什么,但是
if
语句应该类似于:

if [[ $something == "" ]] ; then
    # do something
fi

换句话说,括号和参数之间至少需要一些空格。

首先,您的
if
语句需要一些空格,而
-eq
是不必要的:

if [ %s = "" ]; then
    class="blank"
else
    class="red"
fi
但更重要的是,
%s
不是一个变量,因此您无法将其与任何东西进行比较(或者如注释中所指出的,这是没有用的)。它只是
printf
命令的占位符。您必须更明确一点:

hosts=($(cat "$file"))
echo "<table>"
echo "<tr>"
for host in ${hosts[@]}; do
    host=$(echo $host | cut -d'.' -f1)
    if [ "$host" = "" ]; then
        echo "<td class='blank'>"
    else
        echo "<td class='red'>"
    fi
done
echo "</tr>\n"
echo "</table>"
hosts=($(cat“$文件”))
回声“”
回声“”
对于${hosts[@]};do中的主机
主机=$(echo$host | cut-d'.-f1)
如果[“$host”=”],则
回声“”
其他的
回声“”
fi
完成
回显“\n”
回声“”

(前面的已经过最低限度的测试。)

首先,您的
if
语句需要一些空格,并且
-eq
是不必要的:

if [ %s = "" ]; then
    class="blank"
else
    class="red"
fi
但更重要的是,
%s
不是一个变量,因此您无法将其与任何东西进行比较(或者如注释中所指出的,这是没有用的)。它只是
printf
命令的占位符。您必须更明确一点:

hosts=($(cat "$file"))
echo "<table>"
echo "<tr>"
for host in ${hosts[@]}; do
    host=$(echo $host | cut -d'.' -f1)
    if [ "$host" = "" ]; then
        echo "<td class='blank'>"
    else
        echo "<td class='red'>"
    fi
done
echo "</tr>\n"
echo "</table>"
hosts=($(cat“$文件”))
回声“”
回声“”
对于${hosts[@]};do中的主机
主机=$(echo$host | cut-d'.-f1)
如果[“$host”=”],则
回声“”
其他的
回声“”
fi
完成
回显“\n”
回声“”

(前面已经过最低限度的测试。)

在“=”之后应该有一个空格,
fi
之后的行中是否缺少
echo
?@Pumbaa80是。请忽略它。字符串“%s”永远不是emtpy字符串,因此比较是没有意义的。通常,如果要检查字符串是否为空,最好使用test-z。(如果[-z%s])注意空格,并且注意这始终是false,因为“%s”不是空字符串。在“=”之后应该有空格
fi
之后的行中是否缺少
echo
?@Pumbaa80是的。请忽略它。字符串“%s”永远不是emtpy字符串,因此比较没有意义。通常,如果要检查字符串是否为空,最好使用test-z。(如果[-z%s])请注意空格,并注意这始终是错误的,因为“%s”不是空字符串。第5行正在做什么?它应该是if[$host=”“];然后--right?instad of if[$host=“”];您可以将%s与空字符串进行比较,但比较总是错误的。还有下面的问题--test.sh[4]:server1:未找到。其中server1.com是我输入文件中的第一个条目。第5行正在做什么?它应该是if[$host=”“];然后--right?instad of if[$host=“”];您可以将%s与空字符串进行比较,但比较总是错误的。还有下面的问题--test.sh[4]:server1:未找到。其中server1.com是我输入文件中的第一个条目。@grails_enthu,这是因为
[
实际上是一个命令,因此它需要与
if
关键字和以下参数之间用空格分隔。在
=
运算符周围需要空格,因为
[
命令在决定做什么之前,首先考虑给出的参数数量。请参阅bash手册:并向下滚动到
test
命令。@grails\u enthu,这是因为
[
实际上是一个命令,因此它需要与
if
关键字和以下参数之间用空格分隔。在
=
运算符周围需要空格,因为
[
命令在决定做什么之前,首先考虑给出的参数数量。请参阅bash手册:并向下滚动到
test
命令。