2010-08-31 82 views
2

我不确定此代码不起作用的原因。它不会去复制命令。 我在命令行上手动成功运行(不含检查) 我不认为我正在执行正确的文件检查?有没有更好,更干净的方式来写这个? 我只是想确保文件存在,如果是这样,请复制它。谢谢。shell脚本帮助 - 检查文件是否存在

#!/bin/bash 
if [ $# != 1 ]; then 
    echo "Usage: getcnf.sh <remote-host>" 2>&1 
    exit 1 
fi 

#Declare variables 
HOURDATE=`date '+%Y%m%d%H%M'` 
STAMP=`date '+%Y%m%d-%H:%M'` 
REMOTE_MYCNF=/var/log/mysoft/mysoft.log 
BACKUP_DIR=/home/mysql/dev/logs/ 
export REMOTE_MYCNF HOURDATE STAMP 

#Copy file over 
echo "Checking for mysoft.log file $REMOTE_MYCNF $STAMP" 2>&1 
if [ -f $REMOTE_MYCNF ]; then 
echo "File exists lets bring a copy over...." 2>&1 
    /usr/bin/scp $1:$REMOTE_MYCNF $BACKUP_DIR$1.mysoft.log 
echo "END CP" 2>&1 
    exit 0 
    else 
     echo "Unable to get file" 2>&1 
     exit 0 
fi 

回答

3

您检查远程计算机上已经存在的文件看起来像: 你应该做的:

ssh $host "test -f $file" 
if [ $? = 0 ]; then 
+0

感谢您的帮助。我以这种方式工作。为什么不喜欢它,如果它的书面是这样的?它是间距吗? '如果[$? = 0];然后' – jdamae 2010-08-31 23:05:07

+0

@jda'''是命令,'[$?'不是 – Anycorn 2010-08-31 23:45:46

2

使用sh -x script.sh查看发生了什么。

+0

感谢,其将“无法获取文件”,因此它甚至没有击中SCP。如果我一起删除整个if语句,这将起作用。那么这是否意味着,我的if语句构造不正确? – jdamae 2010-08-31 22:33:27

+0

它应该显示替换变量的if语句,检查它是否正确,然后转到它显示的文件。 – 2010-08-31 22:41:42

+0

感谢您的调试帮助。 – jdamae 2010-08-31 23:05:43

0

您正在测试使用本地名称$REMOTE_MYCNF远程文件

$1:$REMOTE_MYCNF 

的存在。 if测试永远不会满足。

0

你不检查$1设置。

您的文件检查在本地计算机上运行 - 而不是在远程计算机上运行。

0

更改您如果到:

if[! -f $REMOTE_MYCNF -o ! -d $REMOTE_MYCNF]; 
+0

谢谢。这工作。 – jdamae 2010-08-31 22:48:55

+0

这将工作,但不正确,请参阅aaa的答案。另外,-e检查文件和dirs,因此不需要这个或者这个。 – 2010-08-31 22:58:36