首页 > 解决方案 > Linux中的语句结果为字符串比较错误

问题描述

我写了一段代码来检查目标是否被占用,代码如下:

board_status=$(ssh -o ConnectTimeout=2 root@10.31.35.84 -t "cat /userdata/status" )
echo board_status: $board_status 

if [[ $board_status == "BUSY" ]]; then
    echo board is busy
    EVAL_BOARD_IP=0
else
    echo board is not busy
    EVAL_BOARD_IP=10.31.35.84
fi
echo EVAL_BOARD_IP: ${EVAL_BOARD_IP}

我发现它不起作用,打印结果是:

$ sh test.sh
Connection to 10.31.35.84 closed.
board_status: BUSY
board is not busy
EVAL_BOARD_IP: 10.31.35.84

我不明白为什么 if 语句会转到 else 分支

标签: stringbashshell

解决方案


代替

if [[ $board_status == "BUSY" ]]; then

if [[ $board_status =~ "BUSY" ]]; then

第一个命令测试$board_status是否等于BUSY后者测试是否$board_status仅包含字符BUSY

什么地方出了错。

假设该文件/userdata/status有 DOS/Windows 行结尾,这意味着board_status将有一个最后的回车符,\r,如下所示:

 board_status=$'BUSY\r'

使用这个值,观察declare -p输出的样子:

$ declare -p board_status
"eclare -- board_status="BUSY

这是因为后面的回车Y导致终端从行首开始写入,d用应该是该行的最后一个字符覆盖".

如果board_statuswas 实际上BUSY,这就是declare -p命令的样子:

$ board_status=$'BUSY'
$ declare -p board_status
declare -- board_status="BUSY"

推荐阅读