这是脚本。
#!/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$
正如你所看到的,我已经设置value
为00
,并且 的输出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
看看运行脚本时会发生什么。和使用更多报价™!