A questão principal aqui é que as cotações não funcionam dentro de aspas: depois de expandir uma variável, as aspas dentro dela são apenas caracteres comuns, por exemplo:
$ foo='foo "bar doo"'
$ printf "<%s>\n" $foo
<foo>
<"bar>
<doo">
Você deve usar uma matriz para armazenar argumentos de comando assim:
ARGS=(-name 'FOO*.xml' -or -name 'BAR*.xml' -or -name 'BTT*.txt')
O shell processará as cotações nesse estágio e armazenará palavras de shell distintas como elementos de matriz distintos. Use o array assim:
find . "${ARGLINE[@]}"
Se você quiser ou precisar, você pode construir a matriz peça por peça, isso deve resultar na mesma matriz:
ARGS=(-name 'FOO*.xml')
ARGS+=(-or -name 'BAR*.xml')
ARGS+=(-or -name 'BTT*.txt')
No entanto, observe que você também usou backticks para "citar" ${ARGLINE}
. Isso iniciará uma substituição de comando e executará o conteúdo de ARGLINE
como um comando. É daí que vem o seu erro, o shell tenta executar um programa chamado -name
.
Na verdade, no seu exemplo, você não precisa de uma matriz, pois você não tem nenhum espaço em branco dentro dos argumentos. O principal problema aqui é que a diferença entre os espaços em branco entre os argumentos e os espaços em branco dentro dos argumentos se perdem quando a linha de comando é armazenada em uma string. Mas no seu caso, isso pode funcionar, não que eu recomende:
set -f # disable globbing
ARGLINE="-name FOO*.xml -or -name BAR*.xml -or -name BTT*.txt"
find . $ARGLINE