O conselho usual para colocar aspas duplas em torno de expansões de variáveis é porque $foo de aspas externas significa "pegar o valor de foo , dividi-lo em espaços em branco" e expandir cada palavra resultante como um padrão curinga se corresponder a pelo menos um arquivo ”, em vez de“ pegar o valor de foo ”. Em particular, quando a variável foo contiver um nome de arquivo, "$foo" é o que você precisa. Mas aqui as variáveis ARCHIVE_FILEMASK e FILEMASK contêm padrões de curinga. Então, de fato, você quer expandi-los quando eles são usados, portanto você deve usá-los sem aspas. Eles serão, portanto, interpretados como uma lista de padrões separados por espaços em branco; isso não faz diferença aqui, já que você não tem espaço em branco no valor dessas variáveis.
As variáveis f e extractDir contêm nomes de arquivos, portanto devem permanecer entre aspas duplas.
for f in ${ARCHIVE_FILEMASK}
do
if 7z e -aoa -o"${extractDir}" "$f"; then
mv "${extractDir}/"${FILEMASK}.xml "$dest"
fi
done
Como você está usando o bash, pode chamar shopt -s nullglob para tornar o padrão curinga "${extractDir}/"${FILEMASK}.xml expandido em uma lista vazia se não corresponder a nenhum arquivo. O comando mv irá reclamar que está faltando um arquivo se você não passar nenhum arquivo de origem; você pode resolver esse problema invocando-o apenas se houver pelo menos uma correspondência.
shopt -s nullglob
for f in ${ARCHIVE_FILEMASK}
do
if 7z e -aoa -o"${extractDir}" "$f"; then
matches=("${extractDir}/"${FILEMASK}.xml)
if ((${#matches[@]})); then
mv "${matches[@]}" "$dest"
fi
fi
done
¹ Ou mais geralmente conforme indicado por IFS .