为什么一些“if”测试在我的cron脚本中不起作用

时间:2013-05-26 17:37:55

标签: linux bash cron

我一直在“玩弄”一段时间,对于我刚刚解决的大部分问题,但现在我需要解决这个问题。

为什么基本上我的所有cron作业都不能使用“If tests”

让我们来看看这个

if [ "$line" == "downloads.php" ]
当我在shell中运行它时,

工作得非常好,当我把它作为cron工作启动时它就永远不会工作。解决方法

if echo "$line" | grep -q "downloads.php"

双向工作。这是为什么?对于第一个,[]基本上代表“测试”,第二个很好,它只是一个grep。但为什么“测试”在我的cron工作中不起作用? (有或没有重定向到> null)

我目前在cron工作中需要这个,现在我真的不知道如何解决,或者基本上我最终想要了解如何解决这个问题,我做错了什么。

while [[ "${ofile: -1}" != "_" ]]

这个只会产生错误“87:错误替换”,直到第一个字符为“_”

我设法克服了cron的所有问题,从完整路径到环境,这对我来说仍然是一个难题。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

听起来你正在使用bash运行脚本,而cron正在其他shell下运行它;因此,您正在使用的所有bash扩展都失败了。确保脚本上的shebang(即第一行)请求bash(#!/bin/bash),并且cron条目直接运行它而不是指定shell(例如0 0 * * * /path/to/script NOT 0 0 * * * /bin/sh /path/to/script

编辑:有几种不同的方法可以控制哪个shell用于解释脚本,具有明确的优先顺序:

  1. 如果您使用显式shell运行脚本(例如/bin/sh /path/to/script),将使用您告知运行它的shell,并且将忽略任何shebang。
  2. 如果您直接运行脚本(例如/path/to/script./script,或将其放在PATH中并将其作为script运行),系统将使用shebang来确定哪个shell (或其他翻译)用它来运行它。
  3. 如果你直接运行它并且没有shebang,那么你运行它的程序(例如bash,sh或crond)可能选择做其他事情。在这种情况下,bash将使用bash运行脚本。我不确定crond会做什么,甚至可能取决于它是哪个版本。
  4. 一般来说,使用适当的shebang并直接运行脚本是最好的方法;脚本应该“知道”正确的解释器是什么,这应该得到尊重。例如,如果您在便携式shell代码中编写脚本(使用#!/bin/sh shebang),然后需要使用一些仅限bash的功能,您只需更改shebang而不必追踪所有位置它来自。

    显式指定shell应该保留用于shebang错误或丢失的情况(在这种情况下更好的解决方案是修复脚本),或者你没有执行权限(再次修复脚本)。第三种选择是不可靠的后备,应尽可能避免。

    P.S。如果我正在正确阅读您的上一条评论(上图),您想测试$ line 是否包含“downloads.php”,而不是它是否等于;但[ x == y]比较测试是否相等,而非遏制。要测试包含,请使用仅限bash的[[ string == pattern ]]表单:

    if [[ "$line" == *"downloads.php"* ]]