我正在计算删除 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
循环运行良好。
似乎我错过了一些东西:转义引号。知道吗?
反引号不能嵌套。请改用$( ... )
。
如果要
嵌套反引号,则必须对其进行转义:
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")"
希望这有帮助=)