ShellScript

配列内のパッケージをOS問わず自動でインストールするShellScript

ShellScriptの入門として、
配列内のパッケージをインストールするスクリプトを書いてみました。

各OSに対応するために、一致するパッケージマネージャにてインストールを試みます。

#!/bin/bash

# 必要なパッケージ名; ()内を変更する。
required=(foo bar)
# パッケージマネージャ一覧
pm=(brew apt yum port pacman)

# パッケージごとにチェック
for r in ${required[@]}; do
  # パッケージが存在しなければインストールする
  if ! type ${r} >/dev/null 2>&1; then
    for p in ${pm[@]}; do
      # 一致するパッケージマネージャでインストールを試みる。
      if type ${p} >/dev/null 2>&1; then
        echo "Not installed ${r}, will be installed."
        yes | sudo ${p} install ${r}
        break
      fi
    done
  fi

  # 確認をし、インストールに失敗していた場合はループを抜ける。
  if ! type ${r} >/dev/null 2>&1; then
    echo "Error: Required ${r}"
    exit 1
  fi
done

echo "Completed!"

解説

キーワード 解説
${foo} 変数fooの利用
2>&1; 標準エラー出力
> /dev/null 書き込まれたデータを破棄する
> /dev/null 2>&1 参考

typeで一致したパッケージマネージャコマンドを利用してインストールを行うことで,有効なパッケージマネージャを利用してインストールを行うことができます。
インストールに失敗した場合や,sudoを拒否した場合はexit 1にて処理が中断されます。

補足

dash($ sh foo.sh)ではSyntax error: "(" unexpectedとなったため、
エラーが発生する方はbash foo.shで実行すると良いでしょう。

参考

これだけ覚えておけばOK!シェルスクリプトで冪等性を担保するためのTips集
意外な理由(?)で「Shell script arrays Syntax error: “(” unexpected」
いい加減覚えよう。 command > /dev/null 2>&1の意味