sh -c 中的参数替换

sh -c 中的参数替换

我有大量日志文件,我的想法是按日期/月份对它们进行分组,然后打包到档案中。
这是我的脚本:

find /c/this/path/ -type f -name "$file_pattern" | xargs -I fn basename fn | cut -c$start-$end | uniq | xargs -I {} sh -c "tar zcvf {}-$postfix.tgz {}$file_pattern"

所有变量都已定义。但是,当我执行此操作(调用包含此脚本的函数)时,不会创建存档,也不会显示任何错误。当我使用硬编码参数手动运行此操作时,它工作正常。我猜是我搞砸了参数替换。
顺便说一句,我在 Windows 上使用 msysgit 安装附带的命令运行此操作(如果这有任何区别的话)。

答案1

如果我理解你的问题,你想知道如何将参数传递给指定的脚本-c

...|xargs -I {} sh -c 'tar zcvf "$1"-'"$postfix"'.tgz "$1"'"$file_pattern" _ {}

脚本 ( _) 后的第一个参数将变为$0sh下一个参数({}来自 xargs)将是$1。单引号和双引号的混合有点混乱,但这是必要的,因为您需要替换一些参数现在有些则需要你sh来处理。

答案2

你必须像这样调用你的变量,${variable}而不是$variable像惯例那样用大写字母书写${VARIABLE}

答案3

我觉得我理解了这个问题。脚本本身没问题。file_pattern 的定义如下:file_pattern=*.log但是,在当前目录中,我有一个与该通配符匹配的文件(例如 something.log)- 并且 file_pattern 变量填充了该文件的名称。在我将 file_pattern 求值括在双引号中后,一切都正常了。也许有人会告诉我为什么要进行这样的扩展?
编辑我像这样转义了星号:file_pattern=\*.log并且脚本现在运行正常

相关内容