忘れてしまった場合に備えて、すべてのアカウントのパスワードやクレジットカードの PIN などの重要な個人データをすべて保存するテキスト ファイルがあります。当然、そのファイルは暗号化する必要があるため、gpg (GNU Privacy Guard) を使用しました。
問題は、忘れてしまったパスワードを回復するなど、読むためだけでなく、新しいサイトで作成した新しいアカウントのパスワードを書き留めるなど、書き込みのためにも、時々ファイルを再度開かなければならないことです。その後、古いアーカイブを削除し、更新されたテキスト ファイルから新しいアーカイブを作成し、テキスト ファイルを削除する必要があります。
私はこれらすべてを 1 つのアクションで実行する簡単なスクリプトを作成しましたが、今日大きな欠陥を発見しました。新しいパスワードを入力しなかった場合 (選択を繰り返すように求められたときに別の文字列を入力した場合など)、gpg がエラー メッセージを表示するため、アーカイブは当然作成されませんが、スクリプトは最初のアクションとして古いアーカイブを既に削除した後、さらに進んで新しいテキスト ファイルを削除します。
実際のスクリプトは次のとおりです。
rm $1.gpg
gpg -c $1
rm $1
これを回避するには、gpg エラー メッセージをカウントする制御サイクルを入力し、何か問題が発生して新しいアーカイブが作成されなかったことを認識する必要がありますか?
最初の行を削除すればいいことはわかっていますが、アーカイブがすでに存在していることがわかっているので、上書きメッセージに毎回「はい」と答えるのは避けたいです。また、何らかのエラーが発生した場合は、古いアーカイブではなく更新されたテキスト ファイルを保持したいと思います。編集をもう一度繰り返してファイルを変更したくないからです (その間に忘れている可能性もあります)。
答え1
gpg
エラーが発生したときに がゼロ以外の終了コードを返す場合は、それを確認できます。試してみるには、gpg
コマンドを実行し、エラー状態を取得してから、( と仮定してbash
) を入力しますecho $?
。出力が でない場合、前のコマンド (この場合は ) が成功した場合にのみ、0
以下が実行されます。rm
gpg
if [[ $? -eq 0 ]] ; then
rm "$1"
fi
あるいは、テキスト ファイル.gpg
の前にファイルが存在することを確認することもできます。rm
if [[ -f "$1.gpg" ]] ; then
rm "$1"
else
echo "$1.gpg not found, keeping the text file"
fi
もちろん、両方のアプローチを組み合わせて、gpg
成功を確実にすることもできますそして他のファイルが存在します。
変数を使用する場合は必ず引用符で囲む必要があることに注意してください (例として私のコードを参照してください)。そうしないと、スペースなどを含むファイル名でスクリプトが異常な動作をします。