我的文件名为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...
,我无法弄清楚为什么DATE
和LASTBACKUP
变量不同,因为在输出中看起来它们是相同的:
$ testeq
20140407
20140407
Do something, not processed
当我使用时(按照Alex的建议):
echo "LASTBACKUP: '$LASTBACKUP'"
echo "DATE: '$DATE'"
然后我得到:
$ testeq
20140407LASTBACKUP: ''
DATE: '20140407'
现在我很清楚发生了什么。
答案 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
,但我怀疑那个),您会看到错误。它有助于调试。