1

我正在尝试在 bash 脚本中执行此命令

找到 /var/log/apache2/access*.gz -type f -newer ./tmpoldfile !-较新的 ./tmpnewfile | xargs zcat | grep -E '$MONTH\/$YEAR.*GET.*ad=$ADVERTISER HTTP\/1' -c

如果我直接执行它或将它分配给一个变量它返回 0

但是,如果我对命令进行回显(将变量替换为脚本)并在命令行中执行它,它就可以工作。

echo "find /var/log/apache2/access*.gz -type f -newer ./tmpoldfile !-newer ./tmpnewfile | xargs zcat | grep -E '$MONTH\/$YEAR.*GET.*ad=$广告商 HTTP\/1' -c"

我应该如何为工作编写代码

4

1 回答 1

1

变量不在单引号内展开,即'...$NOT_EXPANDED ...'。尝试

find /var/log/apache2/access*.gz -type f -newer ./tmpoldfile ! -newer ./tmpnewfile \
| xargs zcat | grep -E "$MONTH\/$YEAR.*GET.*ad=$ADVERTISER HTTP\/1" -c
# newstuff ------------^------------------------------------------^-----------

与“或将其分配给变量”相同

varCount=$(find /var/log/apache2/access*.gz -type f -newer ./tmpoldfile ! -newer ./tmpnewfile \
| xargs zcat | grep -E "$MONTH\/$YEAR.*GET.*ad=$ADVERTISER HTTP\/1" -c )

另外,我必须评论-exec。许多 find 现在支持find ... -exec ... \+(我假设)相当于xargs,但并非所有操作系统都将 GNU find 作为他们的第一个工具。如果您确定自己永远不会在 Solaris、AIX 或 HPUX 商店中工作,那么请使用改进的功能。此外,如果您使用的是新操作系统,那么xargs可能支持并行处理,我认为find ... -exec ... \+ 不会这样做。

我希望这有帮助。

于 2012-06-06T11:29:31.913 回答