カテゴリー
Linux

最新の Oracle JDK パッケージをダウンロードするシェルスクリプトを勉強する

が、短いながらも Oracle JDK パッケージをダウンロードという素敵なことをやっています!素晴らしい!

だがしかし、何をやっているのかわかりません><。コメントを付けることで理解を深めました。

今回はそのノートとなります。

準備

  • ダウンロードするシェルスクリプトで wget を使用しているので、wget コマンドでファイルを取得
  • wget がインストールされていなければ、yum install wget などでインストールしておく。
# ダウンロード
wget https://gist.githubusercontent.com/n0ts/40dd9bd45578556f93e7/raw/0e9112d60fc0c9228a30e4c92d5e845df3bc1beb/get_oracle_jdk_linux_x64.sh

# 実行
./get_oracle_jdk_linux_x64.sh

ダウンロードしたファイルに set -eux を最初の処理の前に追記し、処理を適当にコメント化して、少しずつ実行しながら理解を深めていきました。

シェルスクリプトにコメントを入れたもの

#!/bin/bash

# You must accept the Oracle Binary Code License
# http://www.oracle.com/technetwork/java/javase/terms/license/index.html
# usage: get_jdk.sh <jdk_version> <ext>
# jdk_version: 8(default) or 9
# ext: rpm or tar.gz

# -e: 何らかのエラーが発生した時点で、それ以降の処理を中断
# -u: 未定義の変数に対して読み込み等を行おうとした場合はエラーとする
# -x: 実行したコマンドを、全て標準エラー出力
# 初心者向け、「上手い」シェルスクリプトの書き方メモ - Qiita https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
set -eux

jdk_version=${1:-8}
ext=${2:-rpm}

readonly url="http://www.oracle.com"
readonly jdk_download_url1="$url/technetwork/java/javase/downloads/index.html"
# curl -s: 進捗を表示しない
# egep -o: 指定された正規表現にマッチする部分を. 改行区切りで標準出力に出力
# head -1: 標準入力の先頭の1行を抜き出す
# cut -d '"' -f 1: " をデリミタとして、1番目のフィールドを抽出
# jdk_download_url2 に代入されたのは次の1行
# /technetwork/java/javase/downloads/jdk8-downloads-2133151.html
readonly jdk_download_url2=$(
    curl -s $jdk_download_url1 | \
    egrep -o "\/technetwork\/java/\javase\/downloads\/jdk${jdk_version}-downloads-.+?\.html" | \
    head -1 | \
    cut -d '"' -f 1
)
# [[ ]] 複合コマンド。test コマンドの代替。
# -z: 単項演算子 -z はヌル文字列かどうかのテストに使われる。
# Linux のヒント: Bash のテスト関数と比較関数 https://www.ibm.com/developerworks/jp/linux/library/l-bash-test.html
# >> /dev/stderr: 標準エラー出力へ追記
[[ -z "$jdk_download_url2" ]] && echo "Could not get jdk download url - $jdk_download_url1" >> /dev/stderr

readonly jdk_download_url3="${url}${jdk_download_url2}"
# jdk_download_url4 には代入されたのは次の2行
# http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.rpm
# http://download.oracle.com/otn-pub/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.rpm
readonly jdk_download_url4=$(
    curl -s $jdk_download_url3 | \
    egrep -o "http\:\/\/download.oracle\.com\/otn-pub\/java\/jdk\/[8-9](u[0-9]+|\+).*\/jdk-${jdk_version}.*(-|_)linux-(x64|x64_bin).$ext"
)

# ${jdk_download_url4[@]}: 配列。egrep の結果は配列として扱える。
# bash 配列まとめ - Qiita https://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59
# --no-cookies: クッキーを使わない
# --no-check-certificate: サーバSSL証明書を検証しない
# --header "Cookie: oraclelicense=accept-securebackup-cookie": ヘッダーの付与
# -N: タイムスタンプ保持
# wgetでこういう時はこうする!! - Qiita https://qiita.com/hirohiro77/items/b774908436ec032df719
for dl_url in ${jdk_download_url4[@]}; do
    wget --no-cookies \
         --no-check-certificate \
         --header "Cookie: oraclelicense=accept-securebackup-cookie" \
         -N $dl_url
done

おわりに

Ansible で Oracle Java をインストールしようとすると、yum は使えません><。

そこで、Oracle からダウンロードすることになるのですが、これが一手間かかります。

そんなときに次のページを見つけました。

気になったのは、このページのコメント部分で、ここに今回読み解いてみようと思ったシェルスクリプトへのリンクがありました。

Bash は、多少なりとも使えますけれども、まだまだですので、便利なシェルスクリプトを 1 行づつ理解することで勉強しようとしたのでした。

最後に、コメントにも記載していますが、参考ページです。ありがとうございます!

以上です。

コメントを残す