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 に答える