Pergunta

Quero criar um shellscript que lê arquivos a partir de um arquivo .diz, onde são armazenadas informações sobre vários arquivos de origem, necessários para compilar um determinado software (ImageMagick neste caso). Estou usando o Mac OSX Leopard 10.5 para esses exemplos.

Basicamente, quero ter uma maneira fácil de manter esses arquivos .diz que contêm as informações para pacotes de origem atualizados. Eu só precisaria atualizar esses arquivos .diz com URLs, informações de versão e somas de verificação de arquivo.

Exemplo de linha:

libpng:1.2.42:libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks:http://downloads.sourceforge.net/project/libpng/00-libpng-stable/1.2.42/libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks:9a5cbe9798927fdf528f3186a8840ebe

Parte do script:

while IFS=: read app version file url md5
do 
  echo "Downloading $app Version: $version"
  curl -L -v -O $url 2>> logfile.txt
  $calculated_md5=`/sbin/md5 $file | /usr/bin/cut -f 2 -d "="`
  echo $calculated_md5    
done < "files.diz"

Na verdade, tenho mais do que apenas uma pergunta sobre isso.

  1. Como calcular e comparar as somas de verificação melhor? Eu queria armazenar somas de verificação MD5 no arquivo .diz e compará -lo com a comparação de string com "Cut" tinging the string
  2. Existe uma maneira de dizer a Curl outro nome de arquivo para salvar? (No meu caso, o nome do arquivo fica feio libpng-1.2.42.tar.bz2? use_mirror = bizNetNetworks)
  3. Parece que tenho problemas com os backsticks que devem direcionar a saída do MD5 tubulações e cortar a variável $ calculado_md5. A sintaxe está errada?

Obrigado!

Foi útil?

Solução

while IFS=: read app version file url md5
do
  echo "Downloading $app Version: $version"
  #use -o for output file. define $outputfile yourself
  curl -L -v  $url -o $outputfile 2>> logfile.txt
  # use $(..) instead of backticks.
  calculated_md5=$(/sbin/md5 "$file" | /usr/bin/cut -f 2 -d "=")
  # compare md5
  case "$calculated_md5" in
    "$md5" )
      echo "md5 ok"
      echo "do something else here";;
  esac
done < "files.diz"

Outras dicas

A seguir, é uma linha prática:

curl -s -L <url> | tee <destination-file> |
sha256sum -c <(echo "a748a107dd0c6146e7f8a40f9d0fde29e19b3e8234d2de7e522a1fea15048e70  -") ||
rm -f <destination-file>

envolvendo -o em uma função que está fazendo 3 argumentos: - o URL - o destino - o SHA256

download() {
   curl -s -L $1 | tee $2 | sha256sum -c <(echo "$3  -") || rm -f $2
}

Meu curl tem um -o (--output) opção para especificar um arquivo de saída. Há também um problema com sua tarefa a $calculated_md5. Não deve ter o sinal de dólar na frente quando você atribui a ele. Eu não tenho /sbin/md5 Aqui, então não posso comentar sobre isso. O que eu tenho é md5sum. Se você também o tiver, pode considerá -lo uma alternativa. Em particular, tem um --check opção que funciona a partir de uma lista de arquivos de MD5Sums que podem ser úteis para sua situação. Hth.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top