Bashでファイルを読み書きする方法――source、パース、リダイレクトの基本
Bashでスクリプトを書いていると、ファイルからデータを読み込んだり、ファイルへデータを書き出したりする場面に必ず出会います。ファイルにはアプリケーションの設定オプションが格納されていることもあれば、ユーザーがアプリケーション上で作成したデータそのものであることもあります。データファイルの扱い方は言語ごとに少しずつ異なりますが、本記事ではBashおよびその他のPOSIXシェルでデータファイルを扱う方法を実例とともに解説します。
Bashのインストール
Linuxをお使いなら、おそらくすでにBashがインストールされています。もし入っていない場合は、各ディストリビューションのソフトウェアリポジトリから簡単に入手できます。
macOSでは標準のターミナルが利用可能です。macOSのバージョンによって、デフォルトのシェルはBashまたはZshのいずれかになります。
Windowsの場合は、Microsoftが公式にサポートしているWindows Subsystem for Linux(WSL)をはじめ、いくつかの方法でBash環境を構築できます。
Bashの準備が整ったら、お好みのテキストエディタを開いて、さっそくコーディングを始めましょう。
Bashでファイルを読み込む
Bashはシェルであると同時に、スクリプト言語としての側面も持っています。Bashでデータを読み込む方法は主に2つあります。1つはデータストリームを作成して出力を解析する方法、もう1つはデータをメモリに読み込む方法です。どちらも有効な手法ですが、それぞれ向いている用途が異なります。
Bashでファイルをsourceする
Bashでファイルを「source」すると、Bashはそのファイルの内容を、既存のデータモデルに組み込める有効なデータとして読み込みます。どんなファイルでもsourceできるわけではありませんが、この方法は設定ファイルや関数の読み込みに特に便利です。
まず、example.shというファイルを作成し、次の内容を記述してみましょう。
#!/bin/sh
greet opensource.com
echo "The meaning of life is $var"
このスクリプトを実行すると、失敗します。
$ bash ./example.sh
./example.sh: line 3: greet: command not found
The meaning of life is
Bashにはgreetというコマンドが存在しないため3行目を実行できず、varという変数の情報もないため、「人生の意味」は空欄のまま表示されました。これを解決するために、include.shというファイルを作成します。
greet() {
echo "Hello ${1}"
}
var=42
続いて、example.shスクリプトにsourceコマンドを追加します。
#!/bin/sh
source include.sh
greet opensource.com
echo "The meaning of life is $var"
スクリプトを再実行すると、今度は正しく動作します。
$ bash ./example.sh
Hello opensource.com
The meaning of life is 42
greet関数はinclude.shファイル内で定義されているため、シェル環境に取り込まれ、引数(この例ではopensource.com)も正しく認識されます。同様に、変数varも設定されて読み込まれています。
Bashでファイルをパースする
データをBashに「取り込む」もう1つの方法は、データをストリームとして解析することです。やり方はさまざまで、grepやcatのように、データを受け取ってstdoutへ出力する任意のコマンドを利用できます。あるいは、Bashに組み込まれているリダイレクト機能を使うことも可能です。ただしリダイレクト単体では結果が見えにくいため、この例では組み込みのechoコマンドを併用して、リダイレクトの結果を出力しています。
#!/bin/sh
echo $( < include.sh )
このコードをstream.shとして保存し、実行して結果を確認してみましょう。
$ bash ./stream.sh
greet() { echo "Hello ${1}" } var=42
$
include.shファイルの各行が、Bashによってターミナルへ出力(エコー)されます。この出力を適切なパーサーにパイプで渡すのが、Bashでデータを読み込む際の定番テクニックです。たとえば、include.shがイコール(=)記号で区切られたキーと値のペアを持つ設定ファイルだと仮定してみましょう。awkやcutを使えば、目的の値だけを簡単に抽出できます。
#!/bin/sh
myVar=`grep var include.sh | cut -d'=' -f2`
echo $myVar
実際にスクリプトを実行してみます。
$ bash ./stream.sh
42
Bashでファイルにデータを書き込む
ユーザーがアプリケーションで作成したデータを保存する場合でも、ユーザーの操作履歴などのメタデータ(ゲームのセーブデータや最近再生した楽曲など)を記録する場合でも、後から利用できるようデータを保存しておく理由は数多くあります。Bashでは、一般的なシェルのリダイレクトを使って、手軽にデータをファイルへ保存できます。
たとえば、出力内容を新しいファイルに書き込むには、リダイレクト記号を1つ使用します。
#!/bin/sh
TZ=UTC
date > date.txt
スクリプトを何度か実行してみましょう。
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:06 UTC 2021
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
既存のファイルにデータを追記したい場合は、リダイレクト記号を2つ重ねて使用します。
#!/bin/sh
TZ=UTC
date >> date.txt
スクリプトを複数回実行すると、以下のように追記されていきます。
$ bash ./date.sh
$ bash ./date.sh
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
Tue Feb 23 22:25:17 UTC 2021
Tue Feb 23 22:25:19 UTC 2021
Tue Feb 23 22:25:22 UTC 2021
手軽なプログラミングのためのBash
Bashの最大の魅力は、その習得のしやすさにあります。基本的な概念をいくつか覚えるだけで、複雑なプログラムを構築できるのです。より詳しい情報については、GNU.orgで公開されている充実した公式Bashドキュメントを参照してください。
-
Rubyでファイルを読み書きする方法を実例つきで徹底解説
Rubyでファイルの読み書きができるようになると、ファイルからデータを抽出したり、新しいファイルを作成したり、必要な情報を素早く見つけたりできるようになります。この記事では、Rubyにおけるファイル操作の基本を、実際のコード例とともにわかりやすく解説します。 この記事で学べること Rubyでファイルを読み込む方法 Rubyでファイルに書き込む方法 覚えておきたいFileクラスのメソッド ディレクトリ操作の基礎 FileUtilsモジュールの使い方 まとめ それでは始めましょう! Rubyでファイルを読み込む方法 Rubyでファイルを読み込む基本的な流れは、次の3ステップです。 op
-
Windows 10の「ファイル履歴」でデータを自動バックアップ・復元する完全ガイド
ハードディスクの故障、停電、その他の予期せぬトラブルから、大切なファイルやドキュメントを守ることは非常に重要です。本来なら定期的なバックアップを行うべきですが、Windowsでは重要なファイルをUSBメモリ(少量のデータ向け)や外付けハードディスク(大量のデータ向け)などの外部ストレージに手動でコピーする方法が一般的です。さらに、クラウドストレージへ毎日自動的にバックアップしてくれる有料ソフトを利用する選択肢もあります。実は、Windows 10には「ファイル履歴(File History)」という優れた機能が標準搭載されており、これを使えばPCのデータを自動的にバックアップできます。 Win