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
.