在匹配前的行上添加文本

在匹配前的行上添加文本

在这种情况下,尝试在找到匹配项(updateKey.sh)之前在该行上添加文本,但无法使其正常工作。这是我的 crontab 文件,脚本将行添加到其中

0 06,18 * * * /home/server/scripts/CCgenerator.sh
0 05 * * * /home/server/scripts/updateKey.sh

第一行“CCgenerator.sh”有时会被删除,但它必须看起来像那样。这是添加该行的脚本。

#!/bin/bash
CCgenerator="0 06,18 * * * /home/server/scripts/CCgenerator.sh"
updateKey="0 05 * * * /home/server/scripts/updateKey.sh"


if ! sudo grep -q "$CCgenerator" /var/spool/cron/crontabs/root; then
    echo "Adds CCgenerator.sh"
    sudo sed -i '/\$updateKey/i $CCgenerator' /var/spool/cron/crontabs/root
    else
    echo "CCgenerator.sh found"
fi
exit

答案1

对于 cron 编辑目的,l0b0 答案是最好的方法,要修复脚本,您必须:

  • 搜索键中的转义点和星号 ( updateKey)
  • 使用替代分隔符sed(我选择%
  • sed 表达式周围的双引号(您希望解析 bash 变量)

#!/bin/bash
CCgenerator="0 06,18 * * * /home/server/scripts/CCgenerator.sh"
updateKey="0 05 \* \* \* /home/server/scripts/updateKey\.sh"

if ! grep -q "$CCgenerator" cron; then
    echo "Adds CCgenerator.sh"
    sed -i "\%$updateKey%i $CCgenerator" cron
else
    echo "CCgenerator.sh found"
fi
exit

答案2

您不想直接更新 crontab,而是使用添加 cron 作业的标准机制:

line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -

答案3

  1. 不要直接编辑 crontab 文件。使用crontab命令,这就是它的用途。

  2. 不要sudo在脚本中多次使用。使用 sudo 运行整个脚本。

  3. 正确引用您的变量和字符串。文字字符串用单引号括起来,变量等插值用双引号括起来。

  4. 您应该 grep 固定字符串而不是正则表达式,因此请使用grep -F.否则*模式中的 s 将被解释为“零个或多个空格”。

  5. 除非您想设置特定的返回值(您没有这样做),否则不需要exit在脚本末尾添加。无论如何,脚本最终都会退出。

  6. 您正在查找CCgenerator.shcrontab 条目是否存在,但随后只是假设该条目updateKey.sh存在。

  7. 更重要的是,为什么你关心 crontab 中的规则在哪里CCgenerator.sh ?如果它位于文件的开头或结尾,效果也一样。所以你根本不需要去寻找updateKey.sh

这应该解决上述所有问题:

#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'

if ! crontab -u root -l | grep -Fq "$CCgenerator" ; then
    echo 'Adding CCgenerator.sh'
    # append "$CCgenerator to end of root's crontab
    (crontab -u root -l ; printf '%s\n' "$CCgenerator") | crontab -u root
else
    echo 'CCgenerator.sh found'
fi

如果您确实不想运行整个脚本,请在每次使用该命令之前sudo添加。sudocrontab

如果你真的关心CCGenerator.sh线相对于updateKey.sh线的位置,那么:

#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
updateKey='0 05 \* \* \* /home/server/scripts/updateKey\.sh'

if ! crontab -u root -l | grep -Fq "$CCgenerator" ; then
    echo 'Adding CCgenerator.sh'
    crontab -u root -l | sed -e "\:$updateKey: i\
$CCgenerator
" | crontab -u root
    else
    echo 'CCgenerator.sh found'
fi

$updateKey但是,如果不在 中,这将无法执行任何操作crontab。更好的版本是 grep for $updateKey,运行sed命令来插入$CCgenerator(如果存在),否则使用类似子 shell 的东西,crontab -u root -l ; printf ...我用来附加$CCgenerator到 crontab 的末尾。

也许是这样的:

#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
updateKey='0 05 \* \* \* /home/server/scripts/updateKey\.sh'

# we're going to use `crontab -u root -l` multiple times, it's
# best to just fetch it once and store it in a variable.
rootcrontab="$(crontab -u root -l)"

if ! grep -Fq "$CCgenerator" <<<"$rootcrontab"; then
    if grep -q "$updateKey" <<<"$rootcrontab" ; then
        echo 'Inserting CCgenerator.sh'
        echo "$rootcrontab" | sed -e "\:$updateKey: i\
$CCgenerator
" | crontab -u root
    else
        echo 'Appending CCgenerator.sh'
        printf '%s\n' "$rootcrontab" "$CCgenerator" | crontab -u root
    fi
else
    echo 'CCgenerator.sh found'
fi

注意:$updateKey已经对其*字符进行了转义,因此我们不需要使用grep -F.

相关内容