Ваше цитирование отключено.
"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 предлагает Вам широкий спектр возможностей. Эти цитируя Синтаксисы интерполирует переменные внутри: "…"
и qq{…}
, где вы можете использовать любой символ в [^\s\w]
в качестве разделителя, и без интерполяционного синтаксиса являются: '…'
и q{…}
с той же гибкостью разделителя, как и раньше:
qq{for dir in *; do
test -d "\$dir" && (find "\$dir" -name '*test' | grep -q . || echo "\$dir");
done}
Конструкции и qq
могут включать разделитель внутри строки, если вхождение сбалансировано: q(a (b) c)
работает.
Третий механизм цитирования является здесь-док:
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
Это полезно для включения более длинные фрагменты, не заботясь о delimitor. Строка заканчивается предопределенным токеном, который должен появиться на отдельной строке. Если декларация delimitor помещается в одиночных кавычках (<<'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'
.
Это оболочки код легко реализуется в Perl. Неправильно использовать несколько разных языков, если это необходимо – Borodin