regex - 查找命令在命令行中有效,但在脚本中无效

标签 regex linux bash find

我正在处理一个需要每晚运行的进程,并将 tar.gz 一大列文件(对于 tar 命令来说太大了)。要解决此问题,我可以创建一个我希望 tar 归档的文件列表并将其传入。我通常手动执行此操作,但我想使用 crontab 使其自动化。

本例中的操作系统是 RedHat Enterprise 6.3 (Santiago)。

我有以下 bash shell 脚本:

#!/bin/bash

now=$(date +"%Y%m%d")

TARGET_DIR=/usr/share/data

FILE_LIST=/home/user/txt-files/data-as-of-$now.txt

if [ -e $FILE_LIST ];
then
    rm -rf $FILE_LIST
fi

CMD="find $TARGET_DIR -regextype posix-extended -regex \".*/$now.*\" -fprint $FILE_LIST"

echo $CMD

findCmd=`$CMD`

if [ $? -ne 0 ];
then
    echo "command failed; $findCmd"
fi

脚本运行良好,但不会向 -fprint 参数中指定的文件写入任何内容。如果我接受回显的命令并将其复制并粘贴到 cli,它会像我预期的那样工作,并且我的文件包含我想要的文件列表。

find /usr/share/data -regextype posix-extended -regex ".*/20140624.*" -fprint /home/user/txt-files/data-as-of-20140624.txt

我猜测正则表达式在作为脚本而不是作为来自 CLI 的命令运行时会被错误解释,这有些古怪。我在其他线程中读到需要将星号括在引号中,并且我尝试了单勾号和双勾号,但似乎都不起作用。我还尝试了执行命令的反引号方式和 $() 方式,两者都产生相同的结果。

如果我收到任何错误或消息,这就不会那么令人困惑了。如果有人可以看看我是否做错了什么,我将不胜感激!

如果我使用 bash -x 运行命令,我会得到以下输出:

[user@data-provider bin]$ bash -x tgz2.sh
++ date +%Y%m%d
+ now=20140624
+ TARGET_DIR=/usr/share/data
+ FILE_LIST=/home/user/txt-files/data-as-of-20140624.txt
+ '[' -e /home/user/txt-files/data-as-of-20140624.txt ']'
+ rm -rf /home/user/txt-files/data-as-of-20140624.txt
+ CMD='find /usr/share/data -regextype posix-extended -regex '\''.*/20140624.*'\'' -fprint /home/user/txt-files/data-as-of-20140624.txt'
+ echo find /usr/share/data -regextype posix-extended -regex ''\''.*/20140624.*'\''' -fprint /home/user/txt-files/data-as-of-20140624.txt
find /usr/share/data -regextype posix-extended -regex '.*/20140624.*' -fprint /home/user/txt-files/data-as-of-20140624.txt
++ find /usr/share/data -regextype posix-extended -regex ''\''.*/20140624.*'\''' -fprint /home/user/txt-files/data-as-of-20140624.txt
+ findCmd=
+ '[' 0 -ne 0 ']'

最佳答案

在脚本中切换到以下语法,没有任何变量分配,解决了这个问题。

find $TARGET_DIR -regextype posix-extended -regex ".*/$now.*" -fprint $FILE_LIST

我测试过的原始语法的问题

cmd="find -regex '.*/test.*' -fprint out.txt
$cmd

是它运行为

find -regex ''\''.*/test.*'\''' -fprint out.txt

但不完全确定为什么变量替换会添加错误的单引号。

关于regex - 查找命令在命令行中有效,但在脚本中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24399957/

相关文章:

arrays - Bash 字符串数组

linux - 如何禁止在 bash 中编辑我的历史记录

javascript - 正则表达式检查字符串是否有两个指定的单词javascript

用于简单问题的 Python 正则表达式

mysql 未在 Ubuntu 16.04.1 LTS 中启动

linux - 如何订购具有特定条件的文本文件?

javascript - Chrome ✗ vs Firefox 中 ES6/Unicode 正则表达式中的逻辑 OR 序列 ✓

JavaScript 正则表达式如果出现次数超过 n 则替换

c++ - 如何使用文件路径进行函数调用?

json - 如何从 json 对象中获取格式化的 json 字符串?