0

我正在计算删除 ZIP 的目录中包含的文件数

当我echo $VAR稍后将其运行到电子邮件时

 VAR=`for i in `find . -mtime 0 -name '*XML*' -exec ls '{}' \;`; do unzip -l "$i"| awk -F. '{if ($2=="XML") print $0}'|wc -l; done| paste -sd+ | bc`

它失败并出现此错误:

-bash: command substitution: line 1: syntax error near unexpected token `;'
-bash: command substitution: line 1: `; do unzip -l "$i"| awk -F. '{if ($2=="XML") print $0}'|wc -l; done| paste -sd+ | bc'
-bash: command substitution: line 2: syntax error: unexpected end of file
-bash: .: -m: invalid option
.: usage: . filename [arguments]

就其本身而言,for循环运行良好。

看来我错过了一些东西:转义引号。任何的想法?

4

2 回答 2

4

反引号不能嵌套。改为使用$( ... )

于 2012-10-08T23:57:02.293 回答
3

如果要嵌套反引号,则必须对其进行转义:

VAR=`for i in \`find . -mtime 0 -name '*XML*' -exec ls '{}' \;\`; do unzip -l "$i"| awk -F. '{if ($2=="XML") print $0}'|wc -l; done| paste -sd+ | bc`

但是,正如choroba 所建议的,最好使用$(...)

VAR=$(for i in $(find . -mtime 0 -name '*XML*' -exec ls '{}' \;); do unzip -l "$i"| awk -F. '{if ($2=="XML") print $0}'|wc -l; done| paste -sd+ | bc)

特别是因为如果您决定在双引号内使用反引号,则必须小心转义内部双引号:

test="example `echo \"internal\"`"

当带括号时,它变得“更干净”:

test="example $(echo "internal")"

希望这会有所帮助=)

于 2012-10-09T00:05:39.773 回答