string - 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 分支
解决方案
代替
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_status
was 实际上BUSY
,这就是declare -p
命令的样子:
$ board_status=$'BUSY'
$ declare -p board_status
declare -- board_status="BUSY"
推荐阅读
- julia - Determine which method is dispatched for a given function call
- flutter - Flutter using class
- php - 按文件名的一部分排序
- rest - 带有运算符的 HTTP 扩展中的 MarkLogic 多个参数
- android - Metro bundler 在“加载依赖图,完成”后停止
- jdbc - 无需 Hibernate 帮助的 ORM 设计
- servicestack - 使用 ServiceStack X 的私有仓库或 web 全局工具
- java - 在多项选择游戏中随机化问题
- javascript - 并行处理 API 和更新表
- javascript - 在另一个文件中显示操作文件中的警报消息