将循环结果传递给VAR失败

时间:2012-10-08 23:53:13

标签: bash

我正在计算删除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循环运行良好。

似乎我错过了一些东西:逃避报价。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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")"

希望这有助于=)

相关问题