比较变量

时间:2014-04-07 12:50:40

标签: bash compare

我的文件名为lastbackup,日期为yyyymmdd格式。现在,我想将此字符串与BASH中相同格式的当前日期进行比较。

我有:

#!/bin/bash

cd ~

DATE=`date +%Y%m%d`
LASTBACKUP=sudo cat ./lastbackup

echo $LASTBACKUP
echo $DATE


if [ "$LASTBACKUP" == "$DATE" ]; then
  echo "Do nothing, already processed."
else 
  echo "Do something, not processed"
  echo -n $DATE > ./lastbackup
fi    

我一直在Do something...,我无法弄清楚为什么DATELASTBACKUP变量不同,因为在输出中看起来它们是相同的:

$ testeq 
20140407
20140407
Do something, not processed

当我使用时(按照Alex的建议):

echo "LASTBACKUP: '$LASTBACKUP'"
echo "DATE: '$DATE'"

然后我得到:

$ testeq 
20140407LASTBACKUP: ''
DATE: '20140407'

现在我很清楚发生了什么。

2 个答案:

答案 0 :(得分:3)

这是错误的原因:

LASTBACKUP=sudo cat ./lastbackup

以这种形式执行命令时:

var=val var2=val2 ... command arg arg ...

变量放入命令的环境中,仅放入到该环境中。因此,当cat正在运行时,它有一个名为LASTBACKUP的环境变量,值为" sudo"。完成cat后,该变量将消失。

./lastbackup文件的内容获取cat到stdout。我很惊讶你echo $LASTBACKUP时看不到空白。检查您的文件是否有CRLF行结尾,或者./lastbackup文件可能不以换行符结尾。

当你调试和打印变量时,做一些更明显的事情来看看它们的价值:

printf "LASTBACKUP='%s'\n" "$LASTBACKUP"
# or
for var in DATE LASTBACKUP; do
    printf "%s='%s'\n" "$var" "${!var}"
done

bash有一种内置的方式来读取文件,因此您不必调用cat:这将有几毫秒的时间:

lastbackup=$(< ./lastbackup)

不要习惯使用ALL_CAPS_VARS - 有一天你会使用PATH=something,然后想知道为什么你的脚本会停止工作。

答案 1 :(得分:2)

是的,问题可能是你实际上没有在任何地方初始化LASTBACKUP变量。

但是你试图用sudo阅读它的事实困扰着我。运行脚本的用户是否有权读取$HOME中的文件?你是cd进入~,这是用户的家,但是因为你对它进行了阅读让我觉得这个文件可能在/root/lastbackup?为什么你会sudo阅读呢?

这应该可以解决问题:

#!/bin/bash

# For testings:
# date +%Y%m%d > $HOME/lastbackup # Uncomment to create a "./lastbackup" test file.

# Let's beging

cd ~

DATE=`date +%Y%m%d`
LASTBACKUP=`cat ./lastbackup`

echo $LASTBACKUP
echo $DATE


if [ "$LASTBACKUP" == "$DATE" ]; then
  echo "Do nothing, already processed."
else 
  echo "Do something, not processed"
  echo -n $DATE > ./lastbackup
fi 

另一种选择,如果您运行的是相当新版本的bash,并且由于您的日期格式没有任何非数字字符作为分隔符(无-/ ... )将考虑if中的值数字:

if (( $LASTBACKUP == $DATE )); then
  echo "Do nothing, already processed."
else 
  echo "Do something, not processed"
  echo -n $DATE > ./lastbackup
fi

并且,在测试时,请勿使用引号LASTBACKUP转义DATE"个变量。如果读取文件时出现问题(或获取当前date,但我怀疑那个),您会看到错误。它有助于调试。