您的报价已关闭。
"for dir in *; do
test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
done"
您已决定用双引号 " 分隔您的字符串,但它们包含在您的字符串中。
转义其他引号:
"for dir in *; do
test -d \"\$dir\" && ( find \"\$dir\" -name '*test' | grep -q . || echo \"\$dir\" );
done"
(容易出错,丑陋)
…或使用另一个分隔符:Perl 为您提供了广泛的可能性。这些引用语法 interpolate 变量在:"…" 和 qq{…} 中,您可以使用 [^\s\w] 中的任何字符作为分隔符,non-interpolating 语法是:@987654327 @ 和 q{…} 具有与以前相同的分隔符灵活性:
qq{for dir in *; do
test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
done}
q 和 qq 构造可以在字符串中包含分隔符,如果出现是平衡的:q( a ( b ) c ) 有效。
第三种引用机制是here-doc:
system( <<END_OF_BASH_SCRIPT );
for dir in *; do
test -d "\$dir" && ( find "\$dir" -name '*test' | grep -q . || echo "\$dir" );
done
END_OF_BASH_SCRIPT
这对于包含更长的片段而不用担心分隔符很有用。字符串以预定义的标记结束,该标记必须单独出现在一行中。如果分隔符声明放在单引号中(<<'END_OF_SCRIPT'),则不会插入任何变量:
system( <<'END_OF_BASH_SCRIPT' );
for dir in *; do
test -d "$dir" && ( find "$dir" -name '*test' | grep -q . || echo "$dir" );
done
END_OF_BASH_SCRIPT
注意q{} 和qq{} 语法:这是一个永远不能在混淆之外使用的功能,但可以使用\w 中的字符作为分隔符。您必须在引用运算符q 或qq 和分隔符之间包含一个空格。这有效:q xabcx 等于 'abc'。