Ubuntu 10.04:当使用[-e]测试时,cronjob中的Bash脚本失败

Ubuntu 10.04:当使用[-e]测试时,cronjob中的Bash脚本失败,bash,testing,ubuntu,cron,Bash,Testing,Ubuntu,Cron,我正在从命令行运行一个脚本,但在放入cronjob时失败。我已经把它缩小到一个具体的问题,即使用[-e“name”]测试文件是否存在。通过在Ubuntu 32位桌面上运行,我可以编写以下脚本,并在从命令行调用时使其工作: #!/bin/bash # define statements IMPORT="/home/${USER}/data_imports/fitb" ARCHIVE="${IMPORT}/archive" declare -a CENTERS CENTERS[0]="ct" CE

我正在从命令行运行一个脚本,但在放入cronjob时失败。我已经把它缩小到一个具体的问题,即使用[-e“name”]测试文件是否存在。通过在Ubuntu 32位桌面上运行,我可以编写以下脚本,并在从命令行调用时使其工作:

#!/bin/bash

# define statements
IMPORT="/home/${USER}/data_imports/fitb"
ARCHIVE="${IMPORT}/archive"
declare -a CENTERS
CENTERS[0]="ct"
CENTERS[1]="ny"
len=${#CENTERS[*]}
RUNDATE=`date --date=yesterday +"%m%d"`
ARCHIVEDATE=`date --date=yesterday +"%Y_%m_%d"`

i=0
while [ $i -lt $len ]; do
  if [ -e "${ARCHIVE}/fitb_${ARCHIVEDATE}_${CENTERS[i]}.csv" ]
  then touch ~/data_imports/fitb/shell_${i}.rn
  fi
  let i++
done

如果我在将touch命令放在自己的行上之后注释掉“If”、“then”和“fi”行,那么while循环在cronjob中运行良好。如果我重新进行If测试,我将一无所获。为了测试它是否被cron守护进程拾取,我将touch命令移动到shebang之后的行,因此它是第一个运行的命令。这不能产生任何效果。我知道使用-e测试的文件位于正确的位置,并具有全局接收权限。是不是-e必须是+w才能使测试成功?我认为这可能是因为变量不是由子shell继承的(据我所知,tst是其中的一种),但如果是这样的话,我认为CLI调用也会失败。

您似乎依赖于定义${USER}。作为cronjob运行时情况并非如此。

10次中有9次,如果cronjob不工作(但脚本在交互式会话中工作),则某些环境变量存在问题。尝试在/tmp/blah或其他文件中回显您正在测试的文件,然后从cron运行该文件,以查看是否是您期望的文件。如果不是,它可能是环境变量,正如asf107所建议的,我在阅读了一些关于bash测试的内容后想到了这一点,但是我通过让它接触${IMPORT}/shell{I}.rn进行了测试。我不知道我在测试过程中弄糟了什么,但这似乎是问题所在。可能是我把USER=
whoami
放进去了,因为cron作业现在运行良好。非常感谢。