Search code examples
bashcurlshellchecksumbackticks

creating a file downloading script with checksum verification


I want to create a shellscript that reads files from a .diz file, where information about various source files are stored, that are needed to compile a certain piece of software (imagemagick in this case). i am using Mac OSX Leopard 10.5 for this examples.

Basically i want to have an easy way to maintain these .diz files that hold the information for up-to-date source packages. i would just need to update these .diz files with urls, version information and file checksums.

Example line:

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

script part:

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"

Actually I have more than just one question concerning this.

  1. how to calculate and compare the checksums the best? i wanted to store md5 checksums in the .diz file and compare it with string comparison with "cut"ting out the string
  2. is there a way to tell curl another filename to save to? (in my case the filename gets ugly libpng-1.2.42.tar.bz2?use_mirror=biznetnetworks)
  3. i seem to have issues with the backticks that should direct the output of the piped md5 and cut into the variable $calculated_md5. is the syntax wrong?

Thanks!


Solution

  • 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"