【问题标题】:Shell Script Not Finding FileShell 脚本找不到文件
【发布时间】:2014-02-04 12:43:43
【问题描述】:

您好,我正在尝试编写一个简单的 shell 脚本,用于在 cronjob 中通过 FTP 将网站文件的备份存档复制到远程服务器。

当我手动输入文件名时,下面的脚本可以工作,但是将日期和文件名指定为变量,它会返回找不到“.tar.gz”,就好像它忽略了第一部分一样文件名。

如果有人能告诉我哪里出错了,我将不胜感激。

#!/bin/sh
NOW=$(date +"%F")
FILE="$NOW_website_files.tar.gz"

# set the local backup dir
cd "/home/localserver/backup_files/"

# login to remote server

ftp -n "**HOST HIDDEN**" <<END
user "**USER HIDDEN**" "**PASSWORD HIDDEN**"
cd "/backup_files"
put $FILE
quit
END

【问题讨论】:

    标签: bash shell ftp backup


    【解决方案1】:

    这是因为它正在寻找一个不存在的变量名NOW_website_files,因此结果文件名的计算结果为.tar.gz

    要解决它,请执行以下操作:

    #!/bin/sh
    NOW=$(date +"%F")
    FILE="${NOW}_website_files.tar.gz"
           ^   ^
    

    而不是

    FILE="$NOW_website_files.tar.gz"
    

    这样,它会将变量$NEW 连接到_website_files.tar.gz 文本。

    【讨论】:

    • 更准确地说,它实际上是在寻找一个名为 NOW_website_files 的变量(_ 是变量名的有效字符),它不存在,因此生成的文件名计算为 @ 987654330@,解释 OP 看到的错误消息。
    • 完全正确,用你非常清楚的解释更新了我的答案,@YS-L。谢谢!
    • 谢谢,对 shell 脚本还是很陌生,所以这让我完全不知道为什么它不起作用。
    • 很高兴阅读,@user3270861!由于您是新来的,如果您的问题已经解决,请不要忘记将答案标记为已接受。您可以单击答案旁边的复选标记将其从空心切换为绿色。如有任何疑问,请参阅Help Center > Asking
    【解决方案2】:

    你可以这样做:

    FILE=$(date +"%F_website_files.tar.gz")
    

    而不是这个:

    NOW=$(date +"%F")
    FILE="$NOW_website_files.tar.gz"
    

    重要

    顺便说一句,考虑在您的 FTP 脚本中添加“bi”,因为您正在明确 PUT 二进制文件并且您不希望在二进制文件中发生 CR/LF 转换...

    【讨论】:

    • 谢谢,我最初使用 PHP 来备份网站存档,但是它一直在用尽内存,所以不得不求助于 shell 脚本作为我不熟悉的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2018-04-10
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多