【问题标题】:Bash string comparison not working on BusyBoxBash 字符串比较在 BusyBox 上不起作用
【发布时间】:2019-05-02 12:16:19
【问题描述】:

我不明白为什么这个 bash 脚本在 BusyBox v1.29.3 () 内置 shell (ash) 上不起作用。

代码如下:

#!/bin/sh

MODE=$(cat /etc/config/wireless | grep 'option mode') #not working
#MODE="option mode 'sta'" ==> this works
echo $MODE

MCHECK="option mode 'sta'"

echo $MCHECK

if [ "$MCHECK" = "$MODE" ];then
   ping -c3 www.google.com > /dev/null
   a=$?
   echo $a
   if [ $a -eq 0 ];then
      echo "ok"
   else
      echo "fail"
   fi
else
    echo "no sta mode"
fi  

如果我用变量“强制”字符串,它可以正常工作。(#MODE) 我想 cat 返回的变量中有一些字符会创建不同的字符串。

我总是得到“无 sta 模式”,所以 if 不会返回 true。 etc/config/wireless 中的选项模式与要比较的字符串相同。

找不到我缺少的东西..?

【问题讨论】:

  • if 表达式中将[[ == ]] 替换为[ = ][[ 是 Bash 语法。 [ 是 Bourne shell 语法。
  • 用双引号将结果字符串括起来,MODE="$(cat /etc/config/wireless | grep 'option mode')"
  • 我编辑是因为有一个错误@Anubis 谢谢,我试过了,但没有用
  • 问题是cat /etc/config/wireless | grep 'option mode' 没有提供你需要的东西。您是否手动验证了这一点?输出应该与$MCHECK 内容“相同”。
  • 好的,我找到了。猫 /etc/config/无线 | grep 'option mode' 在“option mode 'sta'”之前返回 8 个空格 如果我将 MCHECK="option mode 'sta'" 更改为 MCHECK="8spaceshereoption mode 'sta'" 这有效!谢谢你们!

标签: bash string-comparison busybox


【解决方案1】:

以下问题给出了一个带有前导零的字符串。

MODE="$(cat /etc/config/wireless | grep 'option mode')"

以下给出相同的结果,没有前导空格。

MODE="$(cat /etc/config/wireless | sed -n 's/\s*\(option mode.*\)/\1/p'"

【讨论】:

  • 更简单,sed 's/^\s*//g' ;)
  • @jan6 它将修剪“任何”行中的前导零。但这不是 OP 所需要的。
  • sed '1s/^\s*//' 然后
  • @jan6 它将仅在第一行修剪前导零,但仍输出所有剩余行而不进行修改(也许您想建议sed '1s/^\s*//;q')。但是我不知道 OP 感兴趣的文件的确切内容,但很可能目标行不会作为第一行出现,因为这行似乎描述了某些配置的选项,应该之前已经在一行中给出了。
猜你喜欢
  • 2012-01-22
  • 2012-12-06
  • 2011-09-20
  • 2017-01-02
  • 2014-04-03
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多