bash-if块无效

时间:2012-03-29 12:21:22

标签: bash shell

我有下面的代码。这里的逻辑是如果HostList包含任何blanck条目它应该将类设置为空白,否则它应该是红色。现在我收到错误 -

test.sh [3]:第7行的语法错误:`然后'意外

任何人都可以帮助我吗?谢谢!!

     #! /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

3 个答案:

答案 0 :(得分:5)

Bash对空白非常敏感。这应该有效:

if [ "%s" = "" ]; then

请注意,=用于字符串比较,-eq用于整数。

修改

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

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

首先,您的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>"

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