
bash は多くの Linux ディストリビューションで標準として採用されている。
Linux や macOS に標準で入っており、シェルは人間の入力をコンピュータのカーネルに伝える通訳の役割を持つ。黒い画面にコマンドを打つと、シェルがそれを解釈して実行する仕組みだ。
新しい環境を用意してすぐ使えるうえ、構文がシンプルなので初心者でも手を動かしながら学べる。
macOS にも標準で入っており、Windows でも WSL(Windows Subsystem for Linux)を導入すれば利用できる。異なる OS でもほぼ同じ書き方でスクリプトを実行でき、環境をまたいでも同じ動作を再現できる。
bash は解説記事や情報が豊富で、困ったときも検索すれば解決例が見つかりやすい。長い歴史の中で多くの人が試行錯誤してきたため、ノウハウが蓄積されているのだ。
こうした理由から、bash は「とりあえず触ってみるならこれ」という定番の立ち位置を保っている。そこから zsh や fish に移る人もいるが、入口としては bash が無難だ。
bash を「道具箱」として使う
bash はファイル操作やプログラム実行の入り口になる。マウスでクリックするだけでは見えなかった処理が、bash を通すと文字で確認できる。黒い画面はとっつきにくく見えるが、中身はシンプルで「道具箱」のように必要なコマンドを取り出して使える。
まず覚えておきたい基本のコマンドがある。
pwd
は現在のフォルダを表示する。
ls
はそこにあるファイルを一覧できる。
cd
は別のフォルダに移動する。
cp
はファイルをコピーする。
mv
は移動や名前の変更に使う。
rm
はファイルを削除する。
cat
はファイルの内容を一気に表示。
less
は長いファイルをスクロールしながら読める。
echo
は文字列をそのまま出力する。
これらを組み合わせると、小さなプログラムのように使える。例えば
ls | grep .logと打てば、一覧の中から「.log」を含むファイルだけを抜き出せる。目で探すよりずっと速い。
bash を学ぶときは暗記ではなく実践が近道だ。日常作業を「コマンドで置き換えられるか」と考えて試すのがよい。わからなければ man に続けてコマンド名を入力すれば、使い方をすぐ確認できる。この繰り返しで道具箱の中身が少しずつ増えていく。
bash スクリプトの基本
bash スクリプトは、コマンドを順に並べたテキストファイルである。ファイルの先頭にはシバン行と呼ばれる宣言を書く。これで「このファイルは bash に読ませる」と指定する。
シバン行(shebang,#!)は、スクリプトファイルの 最初の1行目 に書く特別な宣言のこと。#! のあとに使いたいプログラムのパスを書くと、「このファイルはこのプログラムで実行してね」と伝えているわけだ。
#!/bin/bash中身には普段のコマンドを書くだけでよい。
#!/bin/bash
echo "コピー開始"
cp ~/Pictures/*.png ~/backup/
echo "コピー完了"#!/bin/bashはシバン行。このスクリプトを実行するときに「bash を使って読み込んでね」と OS に伝える宣言だ。
echo "コピー開始"echo は文字をそのまま画面に表示するコマンド。この行では「コピー開始」と表示して、処理が始まったことを知らせる。
cp ~/Pictures/*.png ~/backup/cp はコピーコマンド。
~/Pictures/.png は「ホームディレクトリの Pictures フォルダにあるすべての PNGファイル」を意味する。 はワイルドカードで「なんでも一致」を表す。
~/backup/ はコピー先のフォルダ。この行で「Pictures の中にある PNGファイルを backup フォルダにすべてコピーする」という処理をしている。
echo “コピー完了”
コピーが終わったあとに「コピー完了」と表示する。ユーザーに処理が終わったことを知らせる。
保存したあと実行権限をつければ、ワンクリックで処理できる。
chmod +x backup.sh
./backup.sh毎回手作業でコピーしていた操作が一瞬で終わる。
chmod +x backup.shこれは パーミッション(権限)の変更コマンド。
パーミッションとは、ファイルやフォルダに対して「誰が何をしていいか」を決める権限のこと。
Linux や macOS では、すべてのファイルに「読み取り」「書き込み」「実行」という3つの権限がついている。
r は read(読み取り)、w は write(書き込み)、x は execute(実行)となっている。
chmod は「change mode」の略で、ファイルやフォルダの権限を変える。
+x は「実行権限を追加する」という意味。
backup.sh というファイルに「プログラムとして実行できる権限」を与えている。これをやらないと、ただのテキストファイルとして扱われてしまう。
./backup.shこれは実際にスクリプトを実行している行。
./ は「カレントディレクトリ(今いるフォルダ)」を表す。Linux ではセキュリティのため、カレントディレクトリは実行ファイルに含まれていない。だから backup.sh とだけ書いても見つからず、./backup.sh と指定して「ここにあるこのファイルを実行する」と明示する必要がある。
自動化で役立つ構文
変数 は値を保存して再利用できる。
user="taro"
echo "こんにちは、$user"user="taro"user という名前の変数を作って、文字列 taro を代入している。= の前後にスペースを入れるとBash の文法上エラーになる。
echo "こんにちは、$user"echo は文字を出力するコマンド。
$user と書くと、Bash が変数 userを展開して、中身の taro に置き換える。
だから実行すると
こんにちは、taroと表示される。
ループ は同じ処理を繰り返す。
for img in *.jpg; do
echo "処理中: $img"
donefor img in *.jpgforは「繰り返すよ」という宣言。
imgはループ内で使う変数。
*.jpgはワイルドカードで「カレントディレクトリにあるすべての JPG ファイル」を表す。
つまり「jpg ファイルがひとつずつ順番に img に入る」という意味。
do … donedoとdoneの間に書いたコマンドを、ループの回数分だけ実行する。ここではecho “処理中: $img”` が繰り返される。
echo "処理中: $img"echoで文字を出力。
$img はループで代入されたファイル名に置き換わる。
たとえば a.jpg, b.jpg, c.jpg があれば、順番に
処理中: a.jpg
処理中: b.jpg
処理中: c.jpgと表示される。
条件分岐 は状況によって動きを変える。
if [ -f "data.txt" ]; then
echo "data.txt がある"
else
echo "data.txt がない"
fiif [ -f "data.txt" ]; thenif は「もし〜なら」と条件を判定する宣言。
[ -f “data.txt” ] は条件式。
-f は「指定した名前のファイルが存在して通常のファイルかどうか」をチェックするオプション。
「data.txt というファイルがあるか?」を確認している。
then は「条件が真(true)のときに実行する命令の開始」を意味する。
echo "data.txt がある"条件が真ならこの行が実行される。ファイルが存在すれば「data.txt がある」と表示される。
else条件が偽(false)のときに実行する部分をここに書く。この例では「data.txt がない」と表示される。
fiif 文の終わりを示す。Bash では if を閉じるときに fi(if の逆さま)を書くルールになっている。
パイプ は結果を次のコマンドへ渡す。
ls -lh | grep ".sh"ls -lhls はフォルダ内のファイル一覧を表示するコマンド。
-l は 詳細表示(権限、サイズ、日付なども出す)
-h は サイズを見やすく(KB, MB など)表示するオプション
|(パイプ)左側のコマンドの出力を右側のコマンドに渡す。
この場合、ls -lh の結果を grep に渡している。
grep ".sh"grep は文字列検索のコマンド。
“.sh” を含む行だけを抽出する。
この場合は 拡張子が .sh のスクリプトファイル だけ表示される。
ls -lh | grep “.sh” は「詳細付きでファイル一覧を表示して、拡張子 .sh のファイルだけを抜き出す」処理ということになる。
毎日ログを保存するスクリプトを考える。
#!/bin/bash
date_today=$(date +%Y-%m-%d)
journalctl > ~/logs/syslog-$date_today.txt
echo "保存完了: $date_today"date_today=$(date +%Y-%m-%d)date コマンドで今日の日付を取得している。
+%Y-%m-%d は「年-月-日」の形式で出力するオプション。
$( … ) はコマンド置換で、実行結果を変数に代入する仕組み。
この行で date_today という変数に今日の日付が文字列として入る。
journalctl > ~/logs/syslog-$date_today.txtjournalctl はシステムのログを表示するコマンド。
はリダイレクトで、コマンドの出力をファイルに書き込む。
~/logs/syslog-$date_today.txtは保存先のファイル名。変数 $date_today が展開され、たとえば syslog-2025-08-28.txt のようになる。
この行で今日のシステムログをファイルに保存** している。
echo "保存完了: $date_today"保存が終わったことを画面に表示する。変数 $date_today が入るので「保存完了: 2025-08-28」のように出力される。
date で日付を取得して変数に入れ、journalctl の出力をファイルに書き込み、echo で処理の完了を知らせるという流れだ。
まとめ
bash スクリプトは、作業をまとめて任せられる「小さな自作ツール」だ。積み重ねるほどに日常作業がどんどん軽くなる。いきなり全部を覚えようとせず、まずは日常のちょっとした作業を「この操作をコマンドでできるかな?」と試してみる。わからなければ man コマンド名 でマニュアルを調べて確認する。この繰り返しで自然に身につく。




