Um padrão de curinga que não corresponde a nenhum arquivo é deixado sem ser expandido. A intenção é permitir a digitação de um argumento para um comando que contenha caracteres curinga, mas não seja um padrão. Isso faz um pouco de sentido na linha de comando, onde permite salvar dois caracteres de aspas ocasionalmente. Em um script, é muito chato. Infelizmente, não há como alterar esse comportamento no sh tradicional. Você pode verificar se o padrão não foi expandido.
for f in "../$package/${package}Setup"/*/*/*.msi; do
if [ "$f" = "../$package/${package}Setup"/*/*/*.msi" ]; then
# No match
break
fi
…
done
O Bash pode ser instruído para expandir um padrão curinga não correspondente para a lista vazia. Mude sua linha shebang para #!/bin/bash
, e você pode fazer isso:
shopt -s nullglob
for f in "../$package/${package}Setup"/*/*/*.msi; do
…
Existem outros problemas no seu script. A maneira como você usa a variável searchPath
será interrompida se houver espaços ou caracteres curinga (incluindo barras invertidas) em $package
. Não deixe as substituições da variável $searchPath
sem aspas. Sempre use aspas duplas em torno das substituições de variáveis, a menos que você queira que elas sejam tratadas como uma lista de padrões separada por espaço em branco, o que não é o caso aqui - $package
é uma string (exigindo aspas duplas) enquanto o aparente *
faz o lote um padrão de curinga. Coloque o padrão diretamente no loop for
, como acima.
Para registro, em vez destes comandos echo
(que não possuem aspas duplas em torno das substituições de variáveis, então os argumentos serão desconfigurados), use set -x
para exibir cada comando no stderr conforme ele é executado.
Em algum ponto do script, você está definindo IFS=#
, mas nunca está dividindo em #
. Não defina IFS
se você não for usá-lo.
Existem vários problemas com mode=$(echo $file | sed -e 's:.*/.*/\(.*\)/.*\.msi::')
. Como explicado acima, faltam aspas duplas em torno de "$file"
. Além disso, chamar um sed
extra para cada arquivo a ser processado é lento (a execução de processos externos é lenta no Cygwin) e excessivamente complexa. O shell tem construções de processamento de string; enquanto eles são primitivos, eles são suficientes aqui. Seu
dir="${file%/*}"
mode="${dir##*/}"
dir="${dir%/*}"
version="${dir##*/}"