ほぼ中立ブログ

少しだけ百合に偏った雑記ブログ

シェルスクリプトによるパッケージの自動インストール

新しい環境に変わるたびに必要なパッケージなどをインストール作業が段々と苦痛になってきたので、シェルスクリプト(bash)で自動化することにしました。環境はUbuntu 18.04 LTSです。

作った後で何ですが、これくらいなら面倒なことは考えず単純にコマンドを羅列するだけで良かったなぁとこの記事を書きながら思っています。ただ、シェルスクリプトの勉強にはなりましたし、せっかくなので備忘録を兼ねてまとめてみます。

目標

設定ファイルに必要なパッケージ名を書いておき、スクリプトでそれを読み込んでインストールする。ある程度の柔軟性を持たせ、複数のインストールコマンドを使い分けることができるようにする。

ルート権限があるか確認する

今回私がインストールしたかったものは全てルート権限が必要でしたので、スクリプトの最初に確認しすることにしました。Qiitaのこちらの記事の内容をそのまま使わせていただきました。UIDを調べれば良いようですね。ルート権限で実行されていない場合は、簡単なエラーメッセージを出して終了します。

if [[ ! "${EUID:-${UID}}" = 0 ]]; then
    echo "Please run as root" 1>&2
    exit 1
fi

設定ファイルについて

設定ファイルは以下のような書式にしました。

[apt install -y]
foo
foobar

[pip3 install]
hoge
hogehoge

[ ]の中にあるインストールコマンドを読み取り、次の行から書かれているパッケージ名をその末尾につけたコマンドをスクリプト中で順次実行します。次の[ ]の行に到達すると再びその中身を読み取りインストールコマンドが変わります。上の例では実際に実行されるコマンドは以下のようになります。空行は読み込み時にsedで削除することにしました。

# ./auto_install.sh ./packages.txt
...
apt install -y foo
apt install -y foobar
pip3 install hoge
pip3 install hogehoge

スクリプト

作成したスクリプトは以下の通りです。なお、パターンマッチなどのbash依存の機能を使用しています。基本的に参考リンク先の内容を切り貼りして作りましたので、コードで不明な部分がある場合はそちらをご覧ください。

#!/bin/bash

if [[ ! "${EUID:-${UID}}" = 0 ]]; then
    echo "Please run as root" 1>&2
    exit 1
fi

list=$1
install_cmd=""
sed '/^ *$/d' "$list" | while read -r line || [[ -n "${line}" ]]; do
    if [[ "$line" =~ ^\[(.+)\] ]]; then
        install_cmd="${BASH_REMATCH[1]}"
        continue
    fi
    cmd="$install_cmd $line"
    echo "$cmd"
    $cmd
done

パッケージ名が末尾に来ないインストールコマンドは使えないため汎用性に難があります。また、本当は手順の複雑なプログラムのインストールを自動化した方がよいのでしょうけど、力量不足で諦めました。何だか色々中途半端だなぁと我ながら思います。まだまだ勉強しなければorz。

最後までお読みいただきありがとうございました。

参考リンク