【问题标题】:Trouble with "if eq" statement in BashBash 中“if eq”语句的问题
【发布时间】:2012-12-12 14:11:41
【问题描述】:

我编写了一个简短的脚本,它从远程主机上的 /etc/sudoers (## Expires 12122012) 中提取一行,然后使用 date +%d%m%Y 将其与今天的日期进行比较。即使显示分配给它们的变量时这两个值看起来相同,但 if 语句永远不会将它们显示为匹配项。脚本和输出如下。额外的 echo 语句用于验证实际匹配的变量。

#!/bin/bash
TODAY=`date +%d%m%Y`
EXPIRES=`ssh -t hostname "grep Expires /etc/sudoers"`
EXPIREDATE=`echo $EXPIRES | awk -F " " '{ printf $3 }'`

if [ $TODAY = $EXPIREDATE ]
    then
            echo "This matches"
            exit
    else
            echo "this doesn't match"
            echo "$TODAY"
            echo "$EXPIREDATE"
            exit
fi
exit

输出: sh 测试

this doesn't match
12122012
12122012

我尝试了多种比较方法,但没有成功。任何想法表示赞赏。谢谢!

更新
在应用 cmets 的一些建议来检查空白之后,我可以通过 echo 语句看到更多信息。不太清楚这是怎么发生的 0_o

#>echo test${TODAY}more
   test12122012more
#>echo test${EXPIREDATE}more
   more12122012

【问题讨论】:

  • 尝试引用字符串:if [ "$TODAY" = "$EXPIREDATE" ].
  • 你能通过cat thing | od -c发送你的程序的输出吗?
  • 字符串中可能有空格或换行符。而不是echo "$TODAY",打印echo "test${TODAY}test",它将显示空白。
  • @spaceknarf:如果你不在 var 前后放置相同的东西会更有趣,以防有 Windows 行结尾的东西挡住了路。如果这就是我们这里的内容,并且您回显"test${EXPIREDATE}foo",则输出将为foot1212... :)
  • @unwind 我试过两边的引号都没有成功。感谢您的建议,我在 var 之前和之后添加了行,它肯定揭示了一个问题。见下文test12122012word word12122012

标签: bash if-statement compare


【解决方案1】:

您的远程文件正在使用 CRLF 换行符。您需要通过tr 传递您的文本以去除 CR。

... | tr -d '\r'

【讨论】:

  • 做到了!非常感谢。我一直在想办法让它工作:)
猜你喜欢
  • 2015-09-16
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多