ソフトウェアをインストールしてUbuntu 12.04を更新するためのbashスクリプトを書いています。特にapt-getの更新中にスクリプトでapt-getエラーをチェックできるようにして、修正コマンドを含めるか、メッセージでスクリプトを終了できるようにします。これらのタイプのエラーをbashスクリプトでチェックする方法はありますか?
月21日編集:必要な情報だけを提供してくれてありがとう!更新を確認し、エラーが発生したときに再確認してレポートを返すための提案を組み合わせて作成したスクリプトを次に示します。新しいUbuntuインストールをカスタマイズするために使用している長いスクリプトにこれを追加します。
#!/bin/bash
apt-get update
if [ $? != 0 ];
then
echo "That update didn't work out so well. Trying some fancy stuff..."
sleep 3
rm -rf /var/lib/apt/lists/* -vf
apt-get update -f || echo "The errors have overwhelmed us, bro." && exit
fi
echo "You are all updated now, bro!"
最も簡単なアプローチは、apt-get
が正しく終了した場合にのみスクリプトを続行することです。例えば:
Sudo apt-get install BadPackageName &&
## Rest of the script goes here, it will only run
## if the previous command was succesful
または、いずれかの手順が失敗した場合は終了します。
Sudo apt-get install BadPackageName || echo "Installation failed" && exit
これにより、次の出力が得られます。
terdon@oregano ~ $ foo.sh
[Sudo] password for terdon:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package BadPackageName
Installation failed
これは、bashとほとんどの(すべてではないにしても)シェルの基本機能を利用しています。
&&
:前のコマンドが成功した場合にのみ続行します(終了ステータスが0でした)||
:前のコマンドが失敗した場合にのみ続行します(終了ステータスが0ではありませんでした)これは次のようなものを書くことと同等です:
#!/usr/bin/env bash
Sudo apt-get install at
## The exit status of the last command run is
## saved automatically in the special variable $?.
## Therefore, testing if its value is 0, is testing
## whether the last command ran correctly.
if [[ $? > 0 ]]
then
echo "The command failed, exiting."
exit
else
echo "The command ran succesfuly, continuing with script."
fi
パッケージが既にインストールされている場合、apt-get
は正常に実行され、終了ステータスは0になります。
Yoは、次のようにスクリプトを停止するオプションを設定できます。
set -o pipefail # trace ERR through pipes
set -o errexit # same as set -e : exit the script if any statement returns a non-true return value