コース目次 / 第3章

成果物 — つなげて、自動化する

パイプとリダイレクトを覚えて、作品をワンコマンドで守る backup.sh を作ります。

第3章 / 全5章目安 約60分この章のゴール: bash backup.sh で、練習フォルダが日付つきで控えられる
お使いのパソコン
手順が切り替わります

ここからがシェルの本領です。コマンドは、つなげると道具になります。

今日のゴール

bash backup.sh と打つだけで、フォルダが日付つきで控えられる。あなたの最初の自動化です。

まず作業フォルダに戻ります。

Mac をお使いの方

VS Codeのターミナルターミナル
cd ~/Desktop/shell-kit

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

Windows をお使いの方

VS Codeのターミナルターミナル
cd ~/shell-kit

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

WSL のホームには「デスクトップ」がありません。Windows のデスクトップとは別世界なので、このコースの作業フォルダはホームの直下に置きます。エクスプローラーで見る方法は第4章の持ち帰りカードに書いてあります。

1. 調べるための材料を作る

renshuu の中に、はるとの旅メモを作ります。>> は「末尾に足す」でした。

VS Codeのターミナルターミナル
cd renshuuecho "2026-04 直島 港からレンタサイクルで一周" >> tabi-memo.txtecho "2026-05 尾道 坂の途中に猫がたくさん" >> tabi-memo.txtecho "2026-06 金沢 雨の日の石畳がきれい" >> tabi-memo.txtecho "2026-08 松本 夕方の城がいちばんきれい" >> tabi-memo.txtcat tabi-memo.txt

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

cat の結果
2026-04 直島 港からレンタサイクルで一周
2026-05 尾道 坂の途中に猫がたくさん
2026-06 金沢 雨の日の石畳がきれい
2026-08 松本 夕方の城がいちばんきれい

echo は「言われたことをそのまま出す」だけのコマンドで、>> がその出力をファイルの末尾に流し込んでいます。

2. 数える・探す

VS Codeのターミナルターミナル
wc -l tabi-memo.txt

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

こう出る
       4 tabi-memo.txt

wc は word count、-l を付けると行数だけを数えます。

数字の前の空白は環境によって違います。Macでは右寄せで空白が入り、Linux(WSL)では空白なしで 4 tabi-memo.txt と出ます。どちらも正解です。この講座で出力の見た目が割れるのはここだけです。

VS Codeのターミナルターミナル
grep 猫 tabi-memo.txt

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

こう出る
2026-05 尾道 坂の途中に猫がたくさん

grep 探す言葉 ファイル。その言葉を含む行だけを出します。ファイルが1000行あっても一瞬です。

3. つなげる — パイプ

ここがこの章のいちばん大事な考え方です。

VS Codeのターミナルターミナル
grep 2026-0 tabi-memo.txt | wc -l

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

こう出る
       4

|(パイプ)は「左のコマンドの結果を、右のコマンドに流し込む」記号です。

起きていること
grep 2026-0 tabi-memo.txt        4行が出てくる
        │
        │  |  ← パイプで流し込む
        ▼
      wc -l                      流れてきた行を数える → 4

これがUnixの思想です。ひとつのことだけをするコマンドを小さく作って、つなげて使う。grep は探すだけ、wc は数えるだけ。「数えながら探すコマンド」は作らないのがこの世界の作法です。
コマンドを覚えるのが目的ではありません。覚えた数だけ組み合わせが増えるのが、この道具の面白いところです。

4. 流し込む — リダイレクト

パイプが「コマンドへ流す」なら、> は「ファイルへ流す」です。

VS Codeのターミナルターミナル
grep 2026-08 tabi-memo.txt > natsu.txtcat natsu.txt

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

cat の結果
2026-08 松本 夕方の城がいちばんきれい

夏の分だけを別のファイルに取り出せました。

> と >> の違いは、事故の分かれ目です。
> は上書き。行き先にファイルがあっても、何も聞かずに中身を捨てて書き直します。
>> は追記。末尾に足すだけで、元の中身は残ります。
大事なファイルに > を向けない。迷ったら >> を使ってください。コマンド帳を >> で書いてきたのは、このためでもあります。

5. 自動化する — backup.sh

ここまでのコマンドをファイルに並べて置くと、それがプログラムになります。

作業フォルダ(shell-kit)の直下に backup.sh を作って、そのまま書き写してください。

Mac をお使いの方

エディタは何でも構いません。VS Code を使っているなら code backup.sh、ターミナルだけで済ませたいなら nano backup.sh(保存は Ctrl + O → Enter、終了は Ctrl + X)が手軽です。

Windows をお使いの方

WSLの中から code backup.sh と打つと、Windows側のVS Codeが開きます(初回は少し待ちます。WSL用の部品が自動で入ります)。ターミナルだけで済ませたいなら nano backup.sh(保存は Ctrl + O → Enter、終了は Ctrl + X)。
メモ帳で開くのは避けてください。改行の形式が変わってスクリプトが動かなくなることがあります。

backup.sh
# はるとのバックアップ係
# 使い方: bash backup.sh

# 日付を先に1回だけ決める。実行の途中で日をまたいでもズレないようにするため。
# TODAY が外から決まっていればそれを使う(同じ結果をもう一度出したいときのため)。
TODAY="${TODAY:-$(date +%Y-%m-%d)}"

TARGET="renshuu"
DEST="backups/$TODAY"

mkdir -p "$DEST"
cp -R "$TARGET" "$DEST"

echo "$TARGET を $DEST に控えました"
ls "$DEST"

読んでみてください。新しいのは3つだけです。

書き方 何をするか
TARGET="renshuu" 変数。名前に値をしまっておく。使うときは $TARGET
$(date +%Y-%m-%d) $( ) の中でコマンドを走らせて、その結果を値として取り出す
${TODAY:-…} 「TODAY がもう決まっていればそれを使い、無ければ … を使う」
mkdir -p -p を付けると、途中のフォルダも一緒に作る(すでにあっても怒らない)

3行目の TODAY の行は、なくても動きます。入れてあるのは、あとから「あの日の分をもう一度」と指定できるようにするためです。この教材の実行結果が毎日変わらないのも、この書き方のおかげです。
値を外から差し替えられるようにしておく、というのは小さな道具を長く使うためのコツです。

変数を使うときは、いつも “$TARGET” のように引用符で囲みます。名前にスペースが入っていたときに、2つのファイル名として扱われてしまうのを防ぐためです。これは rm と組み合わさると事故になりますので、癖にしてください。

6. 走らせる

VS Codeのターミナルターミナル
bash backup.sh

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

こう出る
renshuu を backups/2026-08-01 に控えました
renshuu

日付の部分は今日の日付になります。 backups フォルダの中に、日付の名前のフォルダができて、その中に renshuu が丸ごと入っています。

もう一度打ってみてください。同じ日なら同じ場所に上書きされ、日が変われば新しいフォルダができます。

bash backup.sh は「bashさん、このファイルに書いてあるコマンドを順に打ってください」という意味です。まだ「実行ファイル」ではありません。次の章で、そこを変えます。

7. コマンド帳に足す

VS Codeのターミナルターミナル
echo "- cat : ファイルの中身を出す" >> cheatsheet.mdecho "- wc -l : 行数を数える" >> cheatsheet.mdecho "- grep : 探す" >> cheatsheet.mdecho "- | : 左の結果を右に渡す" >> cheatsheet.mdecho "- > : 結果をファイルに入れる(上書き)" >> cheatsheet.mdecho "- >> : 結果をファイルの末尾に足す" >> cheatsheet.md

行頭の $ は「ここからコマンド」という目印です。$ は打たないでください。

ハマったら

backup.sh を打っても何も起きない / エラーが出る

まず場所を確かめてください。 pwd が .../shell-kit で終わっていて、ls に backup.sh と renshuu の両方が出ていれば正解です。

cp: renshuu: No such file or directory と出るなら、renshuu の中ではなくその1つ上で打つ必要があります。cd .. で上がってから、もう一度。

「Permission denied」と出る

bash backup.sh ではなく ./backup.sh と打っていませんか。この章ではまだ bash を付けて打ちます。 ./ で打てるようにするのが次の章です。

backups の中が空っぽ

TARGET の綴りを確かめてください。renshuu フォルダが実在しないと、cp が失敗してもスクリプトはそのまま最後まで進んでしまいます。シェルは「途中で失敗しても止まらない」のが既定です。

ZIPで戻したい

このページの下のZIPは、この章を終えた状態のフォルダです。解凍して、その中で作業を続けられます。自分で書き換えた部分は消えてしまうので、先に自分のファイルを別の場所へ待避してから使ってください。

こうなっていればOK

うまくいかないときは、この章の完成ファイル一式(ZIP)をダウンロードして続きから進めても大丈夫です。

卒業まであと1章です。

この章はまだ完了していません。