creating a file downloading script with checksum verification

z3c*_*cko 2 bash shell curl checksum backticks

我想创建一个从.diz文件中读取文件的shellcript,其中存储了编译某个软件所需的各种源文件的信息(在本例中为imagemagick).我在这个例子中使用Mac OSX Leopard 10.5.

基本上我想要一种简单的方法来维护这些.diz文件,这些文件包含最新源包的信息.我只需要用URL,版本信息和文件校验和更新这些.diz文件.

示例行:

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
Run Code Online (Sandbox Code Playgroud)

脚本部分:

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"
Run Code Online (Sandbox Code Playgroud)

实际上我不仅仅有一个问题.

  1. 如何计算和比较校验和最好?我想在.diz文件中存储md5校验和,并将其与字符串比较与"cut"字符串比较
  2. 有没有办法告诉curl另一个文件名保存到?(在我的情况下,文件名变得丑陋libpng-1.2.42.tar.bz2?use_mirror = biznetnetworks)
  3. 我似乎有反引号的问题,应该指导管道md5的输出并切入变量$ calculated_md5.语法错了吗?

谢谢!

gho*_*g74 6

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"
Run Code Online (Sandbox Code Playgroud)


use*_*558 5

下面是一个实用的单行:

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

将它包装在一个带有 3 个参数的函数中: - url - 目的地 - sha256

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