【问题标题】:Incrontab not processing IF statementIncrontab 不处理 IF 语句
【发布时间】:2016-10-17 21:07:40
【问题描述】:

首先我是一个 Windows 人,但现在要负责 Linux。我正在使用 incrontab 监视 Oracle Linux 服务器上的目录。

我正在尝试修改它,以便如果它看到文件F078311,它会将测试回显到日志文件。否则它将检查文件是否匹配第二种格式并执行该回显。

它正在运行第二个 IF 并将日期回显到日志中,但没有将测试回显到日志中。我的语法有问题吗?

它正在监视/export 目录。和$1 将是/export/F073811

incrontab -l
/export IN_MODIFY,IN_CLOSE_WRITE,IN_MOVED_TO /usr/local/scripts/EXPrename.sh $@/$#

Shell 脚本:

#!/bin/bash
# This file is invoked using incron and will rename the file with the current date.

# Set newdate as current date, YYYYMMDD-HHMMSS
newdate="$(date +%Y%m%d-%H%M%S)"

#Sets the filename as the filename_YYYYMMDD-HHMMSS
filename="A$newdate.txt"

joblog="/logs/joblog.log"


[[ ( $1 =~ F073811$ ) ]] &&  echo Test >> /logs/joblog.log

#checks to file format to see if it looks like name_YYYYMMDD-HHMMSS.  If it does not then it renames the file to that format.
[[ ! ( $1 =~ A[0-9]{8}-[0-9]{6}\.txt$ ) ]] && echo ---- `date` ------ >> "$joblog" 

【问题讨论】:

  • 你能打印$1吗?
  • /export/F073811

标签: regex linux shell


【解决方案1】:

在这种情况下,不需要正则表达式,使用basename 计算没有路径的确切文件名,然后检查是否相等

[[ $(basename $1) = F073811 ]] &&  echo Test >> /logs/joblog.log

注意:我刚刚注意到您的命令行按原样适用于我,但不适用于 Bash 3,仅适用于 Bash 4。上述方法适用于两者并且不涉及正则表达式,而且它不会匹配 @ 987654323@ 而你的正则表达式会。

我想得越多,我就越肯定这个问题很可能是你被称为/export/F073811\r 作为第一个参数(MS-DOS 行终止字符滑入,在 Linux 上非常频繁)

【讨论】:

  • 我实际上正在使用基本名称的想法,但分心了,走上了另一个切线。文件名永远不会改变,并且永远是 F078311,所以这行得通。谢谢。
  • 很好,但是关于正则表达式仍然是一个谜,因为它应该可以工作。你在使用 bash 3 吗?并且您确定您的第二个正则表达式有效(如果第一个无效,为什么第二个会?)条件是否定的,因此如果失败,它将每次都在日志中执行回显。
  • GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu)
  • 第二个正则表达式的工作原理是它基本上循环遍历文件名。如果文件名与AYYYYMMDD-HHMMSS.txt 不匹配,则它将日期回显到日志文件并将文件重命名为AYYYYMMDD-HHMMSS.txt。我截断了该部分,因为它与所需的解决方案无关。
  • 好的,你能测试一下:[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched 并告诉我它是否打印出“matched”吗? (来自控制台和您的 cron 任务)?我真的不喜欢这样的谜团,即使你的问题解决了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2016-05-20
  • 2013-08-16
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多