if 语句错误输出

if 语句错误输出

这是脚本。

#!/bin/bash

set -e
echo ""

declare -i value=00
unset optics_status

optics_status=$(curl -I xx.xx.xx.xx:4512 | grep 'X-Trace' | awk '{print $NF}' | rev |cut -c 1-3 | rev)


if [ $optics_status != $value ]; then
    echo "result is different means I am in if loop"
    echo "stats is $optics_status"
else
    echo "result is equal means I am in else loop"
    echo "stats is $optics_status"
fi

xx.xx.xx.xx是服务器 IP,如果我curl单独运行该命令,这就是我得到的输出。

user@machine-lap:~/Documents$ curl -I xx.xx.xx.xx:4512 | grep 'X-Trace' | awk '{print $NF}' | rev |cut -c 1-3 | rev
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0  8359    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
00
user@machine-lap:~/Documents$

正如你所看到的,我已经设置value00,并且 的输出optics_status也是00。所以根据 if 循环,它应该回显,i am in else loop但它只是回显i am in if loop,我不明白为什么。

用更简单的话说,它呼应了声明if而不是else

答案1

如果您希望value变量为00,请不要在 中将其声明为整数bash。用 声明它为整数declare -i将提示 shell 将其计算为整数,并且 的整数值00为零。

观察,以下代码将输出not same

declare -i value='00'
optics_status='00'

if [ "$optics_status" = "$value" ]; then
   echo 'same'
else
   echo 'not same'
fi

更改declare -i value='00'value='00'将使其输出same

另请注意上面变量扩展的引用。


您当然也可以考虑通过使用以下任一方法比较两个变量的值来将它们提升为整数

if [ "$optics_status" -ne "$value" ]; then

或者

if (( optics_status != value )); then

但这假设你知道那$optics_value总是将是一个可以转换为整数的字符串(以及小数整数而不是八进制整数)。

答案2

cut的范围是包容性的,因此您已经取出了三个字符。这些字符之一可能是不可见的,例如空格、制表符或换行符。这使得字符串与值不同00

一般来说,尝试set -o xtrace看看运行脚本时会发生什么。和使用更多报价™

相关内容