如果条件总是评估为真

Kos*_*hur 4 bash shell-script test

        if [[ ${fin[2]} -eq OK && ${fin[7]} -eq NA ]]
        then
                echo "<tr id="green">" >> /tmp/mailt.txt
        elif [[ ${fin[2]} -eq OK && ${fin[7]} -lt 0 ]]
        then
                echo "<tr id="yellow">" >> /tmp/mailt.txt
        elif [[ ${fin[2]} -ne OK && ${fin[7]} -eq NA && $currDate2 -gt $expectedFinishTimes ]]
        then
                echo "<tr id="red">" >> /tmp/mailt.txt
        elif [[ ${fin[2]} -ne OK && ${fin[7]} -eq NA && $currDate2 -lt $expectedFinishTimes ]]
        then
                echo "<tr id="white">" >> /tmp/mailt.txt
        fi
Run Code Online (Sandbox Code Playgroud)

在上面,即使${fin[2]}不等于 OK ,也只有第一个条件被评估为真。怎么了?

Kus*_*nda 19

运算符-eq-ne是用于比较数值数据的算术运算符。

你想要的是==!=

if [[ "${fin[2]}" == 'OK' ]] &&
   [[ "${fin[7]}" == 'NA' ]]; then
Run Code Online (Sandbox Code Playgroud)

elif [[ "${fin[2]}" != 'OK' ]] &&
     [[ "${fin[7]}" == 'NA' ]] &&
     (( currDate2 < expectedFinishTimes )); then
Run Code Online (Sandbox Code Playgroud)

(例如)。


另外,请注意您的引用和echo

echo "<tr id="green">"
Run Code Online (Sandbox Code Playgroud)

最好写成

echo '<tr id="green">'
Run Code Online (Sandbox Code Playgroud)

第一个将产生

<tr id=green>
Run Code Online (Sandbox Code Playgroud)

而第二个将产生

<tr id="green">
Run Code Online (Sandbox Code Playgroud)

  • 请注意,该问题是由 `-eq` 和 `-ne` 隐式导致它们的字符串操作数被递归评估为变量名称引起的,这意味着参数最终会减少到 0(除非您不小心扩展为实际整数变量的名称) . 换句话说,如果 `foo` 和 `OK` 都不是变量名,则 `[[ foo -eq OK ]]` 简化为 `[[ 0 -eq 0 ]]`,这是正确的。 (7认同)