SONUB ホーム JA English 한국어 日本語 中文 हिन्दी বাংলা اردو Español Português Français Deutsch Русский العربية Bahasa Indonesia Tiếng Việt ไทย Türkçe

通知を有効にする方法

このブラウザーまたはアドレスでは通知を利用できません。対応ブラウザーで安全な接続のSONUBサイトを開いてください。

通知がブロックされている場合は、ブラウザーの設定で許可してください。

  1. アドレスバー横のサイト設定、またはブラウザーのサイト設定を開き、このサイトの通知を許可に変更してください。
  2. 端末の設定でブラウザーの通知を許可し、おやすみモードや集中モードを確認してください。
  3. SONUBに戻ってページを再読み込みし、ベルから通知を有効にしてください。

iPhoneやiPadではSONUBをホーム画面に追加し、そこから開いて通知を許可してください。

基本中の基本、ここが出発点

AIが何でもしてくれるのに、なぜシェルを学ぶのでしょう?

に頼めば、本当に何でもやってくれます。しかし何も分からないまますべてを任せてしまうと、AIに縛られ、AIがしたことをまるで自分でやったかのように錯覚してしまいます。

大切な仕事を任せた上司が、その内容をまったく知らないと考えてみてください。部下がうまく進めても結果を判断しにくく、退職すれば引き継ぎにも困ります。AIに任せるときも、基礎知識が必要なのは同じです。

AIも同じです。基本を知っている人だけが、AIのした仕事を理解し、正しいか確かめ、行き詰まったときに自分で続けられます。AIを使いこなす人になるには、基本を知る必要があります。

は、その基本中の基本であり出発点です。シェルコマンドを学ぶとOSの扱い方と管理の基礎が身につき、その次のステップがまさにサーバーを自分で運用することです。

怖がらなくて大丈夫です。分からないコマンドはAIに聞きながら簡単に学べます。一行ずつ自分で打ちながら、一歩ずつ学んでいきましょう。

Pythonの前に身につけたい、シェルの基本

のではを思い浮かべがちですが、AIツールのインストールや実行を支える実用的な基礎は、のとです。

シェルはAIを作るための主な言語ではありませんが、Pythonより前からファイル管理や作業の自動化に使われてきた道具です。

深く学び込む必要はありません。よく使うコマンドをいくつか覚えるだけで、気軽に始められ、一生役立つ基礎になります。

すべてのツールを支える基本言語

シェルプログラミングAIを実際に動かす言語

はの実行、ファイル管理、開発の自動化にとても役立ちます。でもはブラウザ・アプリ・ノートブック・でも使えるので、すべてのAI利用者が端末を使わなければならないわけではありません。

カリキュラムを見る
  • インストール不要ですぐ練習
  • macOS · 対応
  • ブラウザで動く安全な本物のLinux
学習ジャーニー 今日、最初の一歩を踏み出しましょう
0 / 15レッスン完了 0%
15段階のロードマップ
47個の実習ミッション
0回コマンド実行
ステップ・バイ・ステップ

15レッスンで身につけるシェル

基本から ・開発ツール、 や ・ など他の言語の実行、まで、学んだらすぐに実行しましょう。

入門 → 実践
第1部 · レッスン 1–レッスン 4

コマンドの基本

を開き、ファイルを扱い、テキストを探して数え、をつなぎます。この4つのレッスンを終えるだけで、ターミナルを一人で使えるようになります。

  1. レッスン 01 完了 次へ ターミナルとの出会い コマンド構文と現在地を知る ミッション 3個 始める
  2. レッスン 02 完了 次へ ファイルとフォルダー 作成・移動・削除・内容確認 ミッション 3個 始める
  3. レッスン 03 完了 次へ テキスト処理の基本ツール grepで検索、sort・uniq・wcで集計 ミッション 2個 始める
  4. レッスン 04 完了 次へ パイプとリダイレクト コマンドをつなぎ結果をファイルへ ミッション 2個 始める
第2部 · レッスン 5–レッスン 9

スクリプトを作る

値を入れ()、判断して(条件・繰り返し)、のまとまりに名前を付けて()、自分だけの自動化を安全に作ります。

  1. レッスン 05 完了 次へ 変数と展開 値を保存・再利用・計算 ミッション 2個 始める
  2. レッスン 06 完了 次へ 条件と繰り返し ifで判断しforで繰り返す ミッション 2個 始める
  3. レッスン 07 完了 次へ 関数とスクリプト 自分だけのコマンドを作る ミッション 1個 始める
  4. レッスン 08 完了 次へ 実践スクリプト 役立つ自動化を作る ミッション 1個 始める
  5. レッスン 09 完了 次へ 安全なシェル:引用と落とし穴 防御的なスクリプト習慣 ミッション 2個 始める
第3部 · レッスン 10–レッスン 13

実践ツール

と開発ツールをインストールし、から・・・を使って実際の作業をします。

  1. レッスン 10 完了 次へ Node.jsコマンド node・npm・npxでJavaScriptを動かす ミッション 3個 始める
  2. レッスン 11 完了 次へ 開発ツールの導入 Grok・Codex・Claude Code・Firebaseをターミナルへ ミッション 3個 始める
  3. レッスン 12 完了 次へ シェルで他の言語を実行する ターミナルからPython・awk・sedを直接動かす ミッション 5個 始める
  4. レッスン 13 完了 次へ 正規表現 テキストを「形」で探し、取り出し、書き換える ミッション 5個 始める
第4部 · レッスン 14–レッスン 14

ひと目でおさらい

すべてのが共通で守る形を集めました — 枠・・・つなぐ記号。初めて見るコマンドも読めるようになります。このレッスンは先に読んでもかまいません。

  1. レッスン 14 完了 次へ コマンドパターン すべてのコマンドの裏にあるひとつの形 ミッション 3個 始める
第5部 · レッスン 15–レッスン 15

応用 — 本物のLinux

練習用は本物のコンピューターです。空のディスクを自分で準備し、インターネットからダウンロードしてインストールしましょう。本物ので使う手順とまったく同じです。

  1. レッスン 15 完了 次へ ディスク・パッケージ・インターネット ディスクを分けてフォーマットしてマウントし、本物のサーバーのようにダウンロードとインストールをする ミッション 10個 始める
なぜシェル?

一度学べば、どこでも一生使える共通語

AIの回答を自分で実行

ファイル整理や自動化をに頼むと、ので答えが返ってくることがよくあります。シェルを読めれば、実行前に安全性を自分で確認できます。

どこでも通用する基礎力

シェルは何十年も基本の文法がほとんど変わっておらず、macOS・・のどこにでもある共通語です。一度学べばmacOS・Linux・サーバー・・AIツールで長く活用できます。

macOSでもそのまま学べます

macOSの標準シェルはですが、基本コマンドやは多くの場合そのまま使えます。ただし、のないの分割や番号はbashと異なります。はbashを基準に学びましょう。先頭のは、直接実行するときにbashを使う指定です。macOS付属のbash 3.2には -Aなどがないため、それらの例はこのコースので試してください。

実践サンプル

シェルスクリプト一枚でWebサーバーを作る

20行ほどので、に実際にページを返すWebを起動できます。が結局「テキストのかたまりをやり取りする約束」であることがよく分かる例です。

server.sh
#!/bin/bash

PORT=8084
PIPE=simple-web-server-pipe

rm -f "$PIPE"
mkfifo "$PIPE"

response() {
    read -r method path _
    echo "[$(date)] $method $path" >&2
    index=$(cat index.html)
    printf 'HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nConnection: close\r\n\r\n%s' \
      "$index"
}

while true; do
    response < "$PIPE" | nc -l "$PORT" > "$PIPE"
done
  1. mkfifo "$PIPE" を作ります。が受け取ったリクエストと、作った応答がこの通り道を行き来します。
  2. nc -l "$PORT" nc(netcat)で8084番を開き、ブラウザーの接続を待ちます。サーバーを一つで代用します。
  3. response() リクエストの1行目(メソッド・)を読んでログを残し、index.htmlをHTTP 200応答にして返します。
  4. while true; do … done 応答後に接続が切れるとが回り、次の訪問者を受け付けます。おかげでサーバーは動き続けます。

同じフォルダーにindex.htmlを置き、bash server.shで実行してから、ブラウザーで:8084を開いてください。本番用ではありませんが、仕組みの理解に最適です。

レッスン 01 · ハンズオン

ターミナルとの出会い

入力の基本、、を確認する方法を学びます。

かんたんに言うと コンピューターと文字で交わす最初の会話で、一行打つと一行の答えが返ってきます。

学習目標 5個 実習ミッション 3個 約10分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 02 · ハンズオン

ファイルとフォルダー

ファイルやフォルダーを作り、コピー・移動・削除・表示する方法を実践します。

かんたんに言うと ファイル管理画面でマウスを使ってしていた作成・コピー・移動・削除を、文字を打って行います。

学習目標 4個 実習ミッション 3個 約10分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 03 · ハンズオン

テキスト処理の基本ツール

必要な行を探し、並べ替え・重複削除・件数集計を行い、フォルダーの中にあるファイルそのものも探します。

かんたんに言うと とても長い文章に使う、蛍光ペン・並べ替え・数え上げの道具です。

学習目標 5個 実習ミッション 2個 約10分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 04 · ハンズオン

パイプとリダイレクト

|で出力を次の入力へ渡し、>と>>で結果をファイルへ送ります。

かんたんに言うと ベルトコンベヤーのように、の結果を次のコマンドへ渡し、最後に箱(ファイル)に詰めます。

学習目標 4個 実習ミッション 2個 約15分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 05 · ハンズオン

変数と展開

値をに保存し、結果や計算結果を文章に組み込むを学びます。

かんたんに言うと 名札を付けた箱のようなもので、値を入れておき、あとで名前を呼んで取り出します。

学習目標 4個 実習ミッション 2個 約10分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 06 · ハンズオン

条件と繰り返し

ifで動作を選び、forやwhileで同じ作業をます。

かんたんに言うと 「雨なら傘を持つ」「階段を十段上る」のように、判断と繰り返しをさせます。

学習目標 4個 実習ミッション 2個 約15分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 07 · ハンズオン

関数とスクリプト

よく使う処理をにまとめ、・・を理解します。

かんたんに言うと よくする作業を書いたレシピカードのようなもので、名前を呼ぶだけで作業がまるごと終わります。

学習目標 4個 実習ミッション 1個 約15分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 08 · ハンズオン

実践スクリプト

これまでの要素を組み合わせ、安全に実作業を自動化するを学びます。

かんたんに言うと ドミノのように、前の作業が成功したときだけ次の作業が進みます。

学習目標 4個 実習ミッション 1個 約15分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 09 · ハンズオン

安全なシェル:引用と落とし穴

やの事故を防ぎ、エラーが起きたら安全に止まる守りのの書き方を身につけます。

かんたんに言うと シートベルトのように、と安全が事故を前もって防ぎます。

学習目標 4個 実習ミッション 2個 約15分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 10 · ハンズオン

Node.jsコマンド

からを使う方法を学びます。バージョン確認、実行、での管理、の一度きり実行まで。

かんたんに言うと のアプリストアのようなもので、npm が道具を取ってきて、 が のを動かします。

学習目標 4個 実習ミッション 3個 約10分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 11 · ハンズオン

開発ツールの導入

とをに入れる短い案内です。Node/が揃えば、多くは一行から始められます。

かんたんに言うと 新しい作業場に道具を運び込み、一つずつ使えるか確かめるようなものです。

学習目標 4個 実習ミッション 3個 約10分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 12 · ハンズオン

シェルで他の言語を実行する

はすべてを自分でこなすのではなく、他の言語を呼び出す指揮者です。一行で渡す-c、複数行をまとめて渡す、そしてが最もよく使うとを学びます。

かんたんに言うと 通訳のように、シェルが ・awk・sed に仕事を頼み、結果を受け取ってきます。

学習目標 6個 実習ミッション 5個 約30分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 13 · ハンズオン

正規表現

(regex)は、探したいテキストの「形」を書き表すための小さな言語です。日付・メールアドレス・は値こそ違っても形は同じです。で探し、で書き換え、やでチェックしましょう。macOS・・Windowsに最初から入っているも学びます。

かんたんに言うと 「数字3つ-数字4つ」のような形のはんこで、形の合う文字をすべて見つけるようなものです。

学習目標 6個 実習ミッション 5個 約30分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 14 · ハンズオン

コマンドパターン

のはいくつかの形しか守りません。コマンド・・という枠を身につければ、ひとつずつ覚える代わりに、初めて見るコマンドも読んで書けます。

かんたんに言うと 枠に名前が書かれた書類のようなものです。枠が分かれば、どんな書類でも埋められます。

学習目標 4個 実習ミッション 3個 約20分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
レッスン 15 · ハンズオン

ディスク・パッケージ・インターネット

練習用は、空のディスクとつながったインターネットを持つ本物のです。ディスクをに分け、フォーマットし、フォルダーにつないでファイルを保存しましょう。そのあと でWebページを取ってきて、 clone でプロジェクトをコピーし、・・ でをインストールします。本物のとまったく同じやり方です。

かんたんに言うと 新品のパソコンを準備するのと同じです。空のドライブを整えてから、アプリをダウンロードしてインストールします。

学習目標 5個 実習ミッション 10個 約40分
実習を始める AI講師のリエンが文字と音声で答えます(ログインが必要です)。
  1. 1 概念を一つずつ読む
  2. 2 すぐ下の例を押して Enter
  3. 3 ターミナルのミッションを解く
  4. 4 行き詰まったらAIに聞く
学習目標

このレッスンでできること

  1. 1

    コマンド [] の基本形を使う

  2. 2

    現在地を確認してフォルダー間を移動する

  3. 3

    で文字を表示する

  4. 4

    manと--helpで調べる

  5. 5

    管理者権限が必要なコマンドには を付ける

カーソルが点滅する暗いターミナル画面の前で、子どもがキーボードを打っています。受付カウンターの向こうでは親切なコンピューターの係員が、打ち込んだメモを受け取って答えのメモを返します。後ろのフォルダー棚では、今いるフォルダーにピンが刺さっています。
は受付カウンターのようなものです。コマンドを一つ渡すと、コンピューターがそれを実行して結果を返します。 は、今どのフォルダーにいるかを教えてくれます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. コマンド

    後ろに何もいらないもあります — 名前ひとつでコマンド全部です。

  2. コマンド オプション 対象

    ほとんどのが守る形です — 何を、どうやって、何に対して。

  3. cd どこへ

    は移動先ひとつだけを受け取ります。空にするとへ行きます。

  4. echo 文字

    は渡した文をそのまま表示します。空白があればで囲みましょう。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
どこへ
結果が置かれる場所 — 新しい場所か、新しい名前です。
文字
表示する文です。空白があれば引用符で囲みます。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

ターミナルとプロンプト

は文字でを入力する窓です。その内容を読み取って実行するがで、このコースではを使います。$や%などのは入力待ちの印です。その後ろにコマンドを入力し、Enterを押しましょう。この操作方法を(コマンドラインインターフェース)と呼びます。

もっと詳しく プロンプトには $ 以外の情報もよく表示されます。多くのコンピューターでは you@laptop:~$ のように見え、ユーザー名・コンピューター名・今いるフォルダー(~ は)・$ の順に並んでいます。コマンドの実行中はプロンプトが消え、終わるとまた現れます。つまりプロンプトが見えないあいだは、シェルがまだ働いているということです。コマンドが止まったように見えたら、Ctrl+C で止めてプロンプトを取り戻しましょう。

02

コマンドの3要素

多くのは「動作・・」で構成されます。 -l notes.txtなら、notes.txtファイルを詳しく一覧表示するという意味です。知らないコマンドは、manの後ろにその名前を書くか、コマンドの後ろに--helpを付けると説明書が見られます(でも本物のマニュアルが開き、q で閉じます)。

もっと詳しく オプションはふつうダッシュ(-)で始まります。ダッシュ一つには一文字の短いオプションが続き、まとめて書けるので ls -l -a と ls -la は同じです。ダッシュ二つには ls --all のような読みやすい長い名前が続きます。引数はコマンドが扱う対象で、たいていはファイル名やフォルダー名です。ls notes.txt photos のように、一度にいくつも受け取るコマンドもたくさんあります。名前に空白が含まれるときはで囲むと、一つの引数のままになります。

03

現在地を知る

で、で移動、で内容を確認します。~は、..はです。

もっと詳しく はファイルの住所です。絶対パスはディスクのいちばん上の / から始まります(たとえば /home/you/notes.txt)。そのため、どこからでも通じます。相対パスは今いる場所から始まります(photos/cat.jpg)。そのため、正しいフォルダーにいるときだけ通じます。cd だけを打つとすぐホームフォルダーへ戻り、cd - は直前にいたフォルダーへ戻ります。名前を打っている途中で Tab を押すと、が残りを補ってくれます()。打ち間違いが減ります。

04

自分のコンピューターでターミナルを開く

このページでは、何もインストールせずにですぐ練習できます。Macではアプリを開きます(Spotlightで「ターミナル」と検索)。Windowsではスタートメニューからを開きます。このコースと同じを使うには、をインストールしてUbuntuを開きます。たいていのデスクトップではCtrl+Alt+Tを押します。

もっと詳しく Mac の標準は zsh で、このコースのコマンドをほとんどすべて理解します。こことまったく同じシェルを使いたければ bash と打ちましょう。PowerShell では ・・ などいくつかの名前は使えますが動きが違い、存在しないコマンドも多いため、Windows では WSL をおすすめします。どこでも矢印キーで前に打ったコマンドを呼び出せます。もう一度打たずに ↑ を押して、直前のコマンドをもう一度実行したり書き直したりしましょう。

05

root 権限が必要なとき — sudo

コンピューター全体を変える作業 — の導入や /etc のようなシステムフォルダへの書き込み — は管理者(root)の仕事なので、そのまま実行すると と返ってきます。の前に を付ければ、同じコマンドがその権限で動きます(sudo add tree など)。はワードを聞きませんが、自分のパソコンではログインパスワードを入力します。本当に必要なときだけ使いましょう。

もっと詳しく sudoは通常、1つのコマンドを管理者権限で実行します。のインストール(apk add・apt install)、/etc・/usrの変更、ディスクの接続などに使います。ミスを防ぐ機能ではないため、先にコマンドとを確認しましょう。内の権限エラーは所有者と権限を確認します。 install -gもインストール先によってはsudoが不要です。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

ls -la ~/projects
  1. ls: フォルダーの中身を一覧表示します。
  2. -l詳細形式(long): 一行に一つずつ、権限・持ち主・サイズ・日付と一緒に表示します。
  3. -aすべて(all): 名前がドットで始まる( など)も表示します。
  4. ~/projects: (~)の中の projects フォルダーです。省くと、 は今いるフォルダーを一覧表示します。

画面に表示されるもの

total 16
drwxr-xr-x   5 you  staff  160 Oct 17 09:12 .
drwxr-xr-x  20 you  staff  640 Oct 17 09:10 ..
-rw-r--r--   1 you  staff   18 Oct 17 09:11 .env
-rw-r--r--   1 you  staff  512 Oct 17 09:11 notes.txt
drwxr-xr-x   3 you  staff   96 Oct 17 09:12 site

一行が一つの項目です。最初の文字が d ならフォルダー、- ならファイルで、続く r・w・x は誰が読み・書き・実行できるかを表します。そのあとに持ち主、単位のサイズ、最後に変更した日付、名前が続きます。. はそのフォルダー自身、.. はです。最初の行(total)はディスクの使用量なので、気にしなくてかまいません。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

これが | です。左のが出したものが画面に行かず、右のコマンドの中へそのまま入ります。きちんと習うのは第4課ですが、ここから先のすべての課に出てきます — 「そしてそれをそのまま渡す」と読んでください。

  1. ls|wc -l

    がファイルを並べ、 -l がその行数を数えるので、出てくるのは「ファイルが何個か」です。

  2. cat notes.txt|head -3

    がファイル全体を出し、 -3 がそのうち先頭の3行だけを残します。

  3. echo "hello shell"|wc -c

    が送るを -cが数で数えます。末尾の改行も含み、ファイルには保存しません。

つなぐ記号

|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • との間には空白が必要です。-laではなくls -la。
  • はします。
  • は権限がないという意味です。まずのを確認しましょう。/etcへの書き込み例のように管理者権限が必要な作業なら、コマンドの前にを付けます。
学習目標

このレッスンでできること

  1. 1

    フォルダーと空ファイルを作る

  2. 2

    コピー・移動・名前変更・削除を行う

  3. 3

    ・・で内容を見る

  4. 4

    削除を安全に使う

木の形に描かれたフォルダー。幹にある大きなフォルダーがルートで、枝の先にさらにフォルダーが続き、葉はファイルです。あるフォルダーにはホームを表す小さな家があり、地図を持った探検家が幹から光るファイル一つまで点線の道をたどっています。
どのファイルも、一本の大きな木のどこかにあります。/home/me/notes.txt のようなはルートからその葉までの道で、 はフォルダーからフォルダーへあなたを移動させます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. mkdir オプション 対象

    フォルダーを作ります。-p を付けると途中のも一緒に作ります。

  2. cp オプション 対象 どこへ

    コピーは枠が2つです — 何をコピーし、どこへ置くか。フォルダーごとなら -r が必要です。

  3. mv 対象 どこへ

    移動と名前の変更は同じ形です — 新しいフォルダーなら移動、新しい名前なら改名です。

  4. rm オプション 対象

    指定したものを削除します。ごみ箱がないので -i で先に確認させましょう。

それぞれの枠に入れるもの

オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
どこへ
結果が置かれる場所 — 新しい場所か、新しい名前です。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

作成 — mkdirとtouch

はフォルダー、は空ファイルを作ります。mkdir -pならもまとめて作れます。多くのと同じく、成功しても何も表示しないので、で結果を確かめましょう。

もっと詳しく touch にはもう一つの役目があります。ファイルがすでにあれば中身はそのままにして「最後に変更した時刻」だけを更新するので、二回実行しても安全です。一方 mkdir は、フォルダーがすでにあると 'File exists' と文句を言います。ただし -p を付ければ、あるフォルダーは黙って受け入れます。空白を含む名前にはが必要なので(mkdir "my notes")、空白の代わりに - や _ を使ってこの手間を避ける人がたくさんいます。

02

コピー・移動 — cpとmv

は元のファイルを残してコピーを作ります。はファイルを移動したり名前を変えたりします。どちらも元のファイル、移動先の順に書きます。例えばmv memo.txt diary.txtは、同じフォルダ内でmemo.txtをdiary.txtに改名します。

もっと詳しく 最後のが既存のフォルダーなら、cp と mv はファイルを同じ名前のままその中へ入れます。cp a.txt b.txt backup/ は二つのファイルを backup にコピーします。フォルダーを丸ごとコピーするには -r()が必要で、付けないと cp は断ります。mv はなしでフォルダーを移動できます。mv での名前変更は巨大なファイルでも一瞬です。名前が変わるだけで、何もコピーしないからです。

03

内容を見る — cat・head・tail

は全体、とは先頭や末尾だけを表示します。はゴミ箱を使わず即座に削除するため注意が必要です。

もっと詳しく head と tail は、指定しなければ10行を表示します。head -n 3 なら三行です。tail -f はファイルを見張り続け、追加された行を次々に表示するので、を動かしながらログを見るときに使います(Ctrl+C で止めます)。長いファイルには less を使いましょう。一画面ずつ表示し、Space で次のページ、/ で検索、q で終わります。rm はゴミ箱を通らないので、同じ名前やパターンでまず してから rm する習慣をつけると安心です。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

cp -r photos backup/photos-2026
  1. cp: コピーします。
  2. -r: フォルダーとその中身をすべてコピーします。-r がないと、 はフォルダーのコピーを断ります。
  3. photosコピー元: コピーするフォルダーです。
  4. backup/photos-2026コピー先: backup の中に photos-2026 という名前でコピーができます。backup フォルダーは先に存在している必要があります。

画面に表示されるもの

何も表示されません。このようなコマンドは、成功すると何も出力しません。

コピーがうまくいくと、cp は何も表示しません。 backup で確かめると photos-2026 があるはずです。backup がなければ 'No such file or directory' と出るので、 -p backup で先に作ってから、もう一度コピーしてください。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. ls -l|head -3

    詳しい一覧は画面からはみ出すほど長いので、 -3 で先頭の3行だけ見ます。

  2. mkdir -p backup&&cp notes.txt backup/&&ls backup

    前がうまくいったときだけ次へ進みます — は「それができたときだけ」で、最後が結果を見せてくれます。

  3. ls photos|wc -l

    photos フォルダを開かずに、中がいくつあるかを数えます。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • -rfは確認なしでフォルダー全体を削除します。を必ず確認してください。
  • とは同名の対象をできます。-iを使う習慣をつけましょう。
学習目標

このレッスンでできること

  1. 1

    で行を探す

  2. 2

    grep -iと-nを使う

  3. 3

    で並べ替える

  4. 4

    で数える

  5. 5

    find で名前と種類からファイルやフォルダーを探す

テキストの行が書かれた紙がふるいを通り、強調された単語を含む行だけが下に落ちたあと、順番に並べられ、数取り器で数えられている。
grep は欲しい行だけを残し、sort は行を並べ、wc はそれを数えます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. grep オプション 探す文字 どこで

    探す文字が先、どこを探すかが後です。この順序は変わりません。

  2. sort オプション ファイル

    ファイルの行を並べ替えます。-r は逆順、-n は数として並べます。

  3. wc オプション ファイル

    ファイルの内容を数えます。-lは行、-wは単語、-cは数です。バイト数と文字数は異なることがあります。

  4. find どこで 条件 動作

    find は文のように読めます — どこを探し、何に一致し、見つけたものをどうするか。

それぞれの枠に入れるもの

オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
どこで
どこを見るか — コマンドが探して回るファイルやフォルダーです。
ファイル
コマンドが読み書きするファイルです。
探す文字
照らし合わせる文字や形です。引用符で囲んでシェルに触らせません。
条件
判断する検査です。真か偽のどちらかになります。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

grep — 検索

word fileは一致する行だけを表示します。-iはを無視、-nは行番号、-rは検索です。

もっと詳しく grep はファイルを一行ずつ読み、パターンがどこかに含まれている行をすべて表示します。 を探すと 'concatenate' も見つかるのはそのためです。単語全体が一致する行だけにするには -w を付けます。パターンに空白や記号があるときはで囲みます(grep "error " app.log)。-r とフォルダーを渡すと、grep は見つけた行の前にファイル名を付けるので、どこで見つかったかが分かります。

02

並べ替えと集計

は行を順番に並べます。は隣り合う同じ行を1つにするため、離れた重複は先にsortで集めます。 -lは行数を数えます。次の単元ではでこれらをつなぎ、簡単な集計をします。

もっと詳しく sort は文字として比べるので、そのままでは 10 が 9 より前に来ます。数値には sort -n、逆順には sort -r を使います。uniq は隣り合った同じ行しかまとめないので、ほとんどいつも sort のあとに置きます。wc をなしで使うと、行数・単語数・数の三つの数をこの順に表示します。-l・-w・-c で一つだけ選べます。

03

find — ファイルとフォルダーを探す

がファイルの中の行を探すのに対し、find はファイルやフォルダーそのものを探します。出発点のフォルダーとその下のすべてのフォルダーをたどり、条件に合うもののを一行に一つずつ表示します。基本の形は find 場所 条件 動作 です。

  • 場所 — 探し始めるフォルダーです。. は今いるフォルダー、~ はで、省略すると . になります。
  • 条件 — -name "*.txt" は名前で選びます(パターンはで囲みます)。-iname はを区別せず、-type f はファイルだけ、-type d はフォルダーだけを選びます。条件を複数書くと、すべてに合うものだけが選ばれます。
  • 動作 — 何も書かなければ -print(パスを表示)です。-exec {} \; は見つけたものごとにコマンドを実行し、{} の位置に見つけたパスが入ります。

条件なしで find . とだけ打つと、今いるフォルダーの下にあるものがすべて表示されます。結果は ./photos/cat.jpg のように指定したフォルダーから始まるパスなので、そのまま別のコマンドに渡せます。

もっと詳しく find は名前が合うものだけを見るのではなく、フォルダーの木全体を上から下までたどります。そのため / やホームフォルダー全体のような大きな場所で実行すると時間がかかり、読む権限のないフォルダーごとに の行が混ざります。そのエラーは末尾に 2> を付けて捨てます。-maxdepth 1 を付けると今いるフォルダーだけを見て、サブフォルダーには入りません。-name は大文字小文字を区別し(README.md と readme.md は別物です)、パスではなく名前だけを見ます。パスで合わせるには -path "*/src/*" を使います。grep と組み合わせると「その言葉を含むファイルはどれか」が分かります: find . -name "*.js" -exec grep -l "TODO" {} +

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

grep -rin "todo" src/
  1. grep: パターンを含む行を探します。
  2. -r: フォルダーとそのすべてのサブフォルダーにあるファイルを探します。
  3. -iを無視: TODO・Todo・todo がすべて一致します。
  4. -n行番号: 一致した行の番号も表示します。
  5. "todo"探すパターンです。一語ならはなくてもかまいませんが、付ける習慣をつけておくとよいでしょう。
  6. src/探す場所: src フォルダーです。

画面に表示されるもの

src/app.js:12:  // TODO: check the password length
src/utils/date.js:3:// todo: handle time zones

見つかったものは「ファイル名 : 行番号 : その行の内容」の形で表示されます。そのファイルのその行を開いて対処しましょう。一致する行がないと は何も表示しませんが、エラーではありません。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. grep "echo" todo.sh|wc -l

    が合う行を見つけ、 -l がその行を数えるので、何回出てくるかが分かります。

  2. sort notes.txt|head -3

    先に行を並べ替えてから先頭の3行だけ残します — アルファベット順で最初の3つです。

  3. find . -name "*.txt"|wc -l

    find は見つけるたびにを1行ずつ出すので、行を数えればファイルの数になります。

つなぐ記号

|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • はします。 と shell は別の言葉なので、grep shell では Shell と書かれた行は見つかりません。大文字小文字を区別しないようにするには、grep -i shell のように -i を付けます。
  • grepは一致しないと何も表示しません。判定だけならgrep -qを使います。
  • find . -name *.txt のようにパターンのを外すと、find が動く前にシェルが *.txt を今いるフォルダーのファイル名(notes.txt)に置き換えてしまいます。すると find はサブフォルダーの .txt ファイルを見逃し、今いるフォルダーに .txt ファイルが二つ以上あると "paths must precede expression" というエラーで止まります。-name のあとのパターンは、いつも "*.txt" のように引用符で囲みましょう。
学習目標

このレッスンでできること

  1. 1

    |でコマンドをつなぐ

  2. 2

    >で保存する

  3. 3

    >>でする

  4. 4

    の流れを理解する

透明な管でつながった三つの機械。一つ目は紙のメモを次々に送り出し、二つ目は回転するふるいで、無地のメモを下の受け皿に落として星印のメモだけを通します。三つ目はそれを積み重ねて数え、最後の管が星印のメモをじょうごから箱に注ぎ込みます。
| は、あるコマンドの出力を次のコマンドへ渡します。メモが機械から機械へ移っていくのと同じです。最後の矢印 > は、最終的な結果をファイルに注ぎ込みます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. コマンド | コマンド

    左のの出力が右のコマンドの入力になります。間にファイルはありません。

  2. コマンド > ファイル

    出力を画面ではなくファイルへ送ります。元の中身は消えます。

  3. コマンド >> ファイル

    同じことですが、消さずに末尾へ書き足します。

  4. コマンド < ファイル

    ファイルをの入力として渡します — 矢印が文の流れる向きを指します。

  5. コマンド 2> ファイル

    2 はを指すので、エラーを結果から切り分けられます。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
ファイル
コマンドが読み書きするファイルです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

パイプ ( | )

A | コマンドBは、Aの出力をBの入力に渡します。 | txtではlsが一覧を作り、grep txtがtxtを含む行だけを表示します。まず左側だけを実行して結果を見てから、|と次のコマンドを付けましょう。

もっと詳しく どのコマンドにも(読む場所)と標準出力(書く場所 — ふつうは画面)があります。は左のコマンドの出力を右のコマンドの入力につなぎ、二つは同時に動くので、データはできたそばから流れていきます。パイプラインは一歩ずつ組み立てましょう。最初のコマンドを実行して出力を見てから、| と次のコマンドを付け足します。

02

リダイレクト ( >, >>, < )

>は、>>は、<はファイルを入力にします。2>はエラーだけを保存します。

もっと詳しく はが始まる前にリダイレクトを準備します。だから data.txt > data.txt はファイルを壊してしまいます。> がまず data.txt を空にし、そのあと sort が空のファイルを読むからです。新しいファイルに書きましょう(sort data.txt > sorted.txt)。数字はの名前です。0 は入力、1 はふつうの出力、2 はエラーなので、2> はエラーだけを、>(1> と同じ)はふつうの出力だけをファイルへ送ります。

03

画面にも表示しつつファイルにも — tee

は入力をファイルに保存しながら、画面や次のにも送ります。T字の管のように流れが2つに分かれます。 | tee list.txtなら一覧を見ながら保存できます。既存の内容にするにはtee -aを使います。

もっと詳しく tee は、管理者権限が必要なファイルに書くときにもよく使われます。 "text" | tee /etc/somefile はうまくいきます。しかし、sudo echo "text" > /etc/somefile は失敗します。リダイレクト(>)をするのは sudo ではなく、自分のだからです。画面にコピーを出さずファイルだけが欲しいときは、最後に > を付けます。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

ls ~/Downloads | grep pdf | wc -l
  1. ls ~/DownloadsDownloads フォルダーの一覧です。出力がへ行くとき、 は一行に一つずつ名前を書きます。
  2. |パイプ: その一覧を画面に出さず、次のへ送ります。
  3. grep pdfpdf を含む行だけを残します。
  4. |二つ目のパイプ: 残った行をさらに渡します。
  5. wc -l届いた行の数を数えます。

画面に表示されるもの

7

画面に書くのは最後のコマンドだけで、ほかのコマンドは出力を渡すだけです。表示される一つの数は、名前に pdf を含むファイルの数です。名前そのものを見たいときは、最後の部分(| -l)を外してもう一度実行しましょう。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. ls|sort -r|head -3

    を三つ続けて — 並べて、順序をひっくり返して、先頭の3つだけ残す。どれも自分の小さな仕事だけをします。

  2. cat notes.txt|wc -l>count.txt&&cat count.txt

    > が数をファイルに置き、 がそのファイルを出して本当に入ったかを見せます。

  3. ls|grep txt|wc -l

    先に絞ってから数える — 「そういうのは何個?」に答える定番のやり方です。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
>
出力をファイルに書きます。そのファイルにあった中身は消えます。
注意

初心者がよくするミス

  • >はを即座にします。内容を残すなら>>を使います。
  • | と > を混同しないでください。 > は何も検索せず、grep という名前の新しいファイルに一覧を保存するだけです。別のに渡すときは |、ファイルに保存するときは > を使います。
学習目標

このレッスンでできること

  1. 1

    変数を作って値を取り出す

  2. 2

    変数を安全にする

  3. 3

    $(( ))で計算する

  4. 4

    $( )でコマンド結果を得る

覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. 名前=値

    自分で名前を付けた箱に値を入れます。= の両側に空白は入れません。

  2. "$名前"

    $ で値を取り出し、二重を残して空白を守ります。

  3. $(コマンド)

    を実行し、その出力を値として使います。

  4. $((値))

    かっこが二重なら計算です — が計算してくれます。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
値
ただの値ひとつ — 数字や単語、短い文です。
名前
自分で付ける名前です。変数・関数・繰り返しに使います。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

変数を作って使う

name=valueで作り、$nameで取り出します。=の左右に空白を入れてはいけません。

もっと詳しく 名には英字・数字・_ だけが使え(日本語の文字は使えません)、数字で始めることはできません。習慣として、自分の変数は小文字、ほかのと共有する設定(・HOME)は大文字で書きます。変数は作ったの中でしか生きていないので、新しいを開くと消えています。どのセッションでも使いたいなら、その行を ~/.bashrc(Mac では ~/.zshrc)に書いておきましょう。

02

ダブルクォートで守る

"$name"のように囲むと、値の空白が保たれます。安全なの基本習慣です。

もっと詳しく の中でも $ は働くので "$name" は値になりますが、空白は守られ、* がファイル名に変わることも防がれます。のすぐ後ろに文字が続くときは、ブレースで名前の終わりを示しましょう。"${name}s" は値の後ろに s を付けて表示しますが、"$names" は names という変数を探してしまいます。シングルクォートは変数を完全に止めます('$name' は $name のまま表示されます)。

03

算術展開とコマンド置換

$(( ))は計算結果を入れます。$(( 3 + 4 ))なら7です。$( )はの出力を入れます。today=$(date)はdateを実行し、出力をtodayに保存します。括弧が二重なら計算、一重ならコマンド実行と覚えましょう。

もっと詳しく $(( )) の中ではを $ なしで書け($(( count + 1 )))、+・-・*・/・%(余り)とかっこが使えます。 は整数でしか計算しないので、$(( 7 / 2 )) は 3 です。小数点以下は切り捨てられます。$( ) は別物で、コマンドを実行します。二つを組み合わせると、files=$( | -l); "$(( files * 2 ))" のような行になります。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

today=$(date +%F); cp notes.txt "notes-$today.txt"
  1. today=today というを作ります。= の前後に空白を入れてはいけません。
  2. $(date +%F)date を実行して、その答えをここに入れます。+%F は 2026-10-17 の形の日付を求める指定です。
  3. ;最初のの終わり。続けて同じ行で次のコマンドを実行します。
  4. cp notes.txtnotes.txt をコピーします …
  5. "notes-$today.txt"… この新しい名前へ。$today は日付に置き換わり、が全体を一つの名前にまとめます。

画面に表示されるもの

何も表示されません。このようなコマンドは、成功すると何も出力しません。

コピーがうまくいくと何も表示されません。 を実行すると notes-2026-10-17.txt が見えます。明日同じ行を実行すれば明日の日付の新しいファイルができるので、簡単な毎日のバックアップになります。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. count=$(ls|wc -l)&&echo "files: $count"

    $( ) がつないだの出力を受け取るので、つなぎ全体が値一つになります。

  2. echo "$HOME"|wc -c

    に入っている値も、ほかの出力とまったく同じように渡せます。

  3. first=$(head -1 notes.txt)&&echo "$first"

    ファイルの最初の行を自分で付けた名前に入れて、それを出します。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • =の周りに空白を入れると名前がとして扱われます。
  • しないは空白で分割されます。 "$name"を基本にしましょう。
学習目標

このレッスンでできること

  1. 1

    if / elif / elseでする

  2. 2

    [[ ]]で比較する

  3. 3

    forで一覧を処理する

  4. 4

    数値との比較を区別する

ベルトコンベアがファイルの箱を一つずつロボットアームへ運び、ベルトの分かれ道で、検査ランプに応じて箱が左か右へ進む。
for は項目を一つずつ取り出し、if はそれぞれをどうするかを決めます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. if [[ 条件 ]]; then 動作; fi

    if で開き、fi で閉じます。条件が動作を実行するかどうかを決めます。

  2. for 名前 in リスト; do 動作; done

    リストの項目がひとつずつ名前の枠に入り、そのたびに動作が実行されます。

  3. while [[ 条件 ]]; do 動作; done

    条件が真のあいだ繰り返すので、中で何かがその条件を変える必要があります。

  4. case 値 in 探す文字) 動作;; esac

    ひとつの値をいくつもの形と照らし合わせます。枝ごとに ;; で終え、esac で全部を閉じます。

それぞれの枠に入れるもの

探す文字
照らし合わせる文字や形です。引用符で囲んでシェルに触らせません。
値
ただの値ひとつ — 数字や単語、短い文です。
名前
自分で付ける名前です。変数・関数・繰り返しに使います。
リスト
ひとつずつ順に回る項目です。
条件
判断する検査です。真か偽のどちらかになります。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

if文

ifは条件を調べ、真ならthenの後のを実行します。別の条件はelif、どれにも当てはまらない場合はelseに書き、最後にfiで閉じます。if 条件; then ... fiを「この条件なら、この処理」と読んでみましょう。

もっと詳しく if のあとの条件は、実はコマンドです。if はそれを実行してを確かめ、0 なら真とみなします。だから if -q milk notes.txt; then … はかっこなしでも動きます。then と fi のあいだの行は字下げして、各ブロックの終わりが見えるようにしましょう。全部を一行で書くときは、then の前の ; を忘れずに。

02

[[ ]]で比較

は==と!=、数値は-eq(等しい)・-gt(より大きい)・-lt(より小さい)・-ge(以上)・-le(以下)、ファイルとフォルダーは-fや-dで確認します。

もっと詳しく の中では、(かつ)と ||(または)で検査をつなげ、! は否定を表します: [[ -f notes.txt && ! -d backup ]]。迷ったら、比較するはで囲みましょう。古い一重の [ ] では必須です。空の変数がに穴をあけてしまうからです。数だけを扱うなら (( )) のほうが自然に読めます: if (( score >= 80 )); then …

03

forループ

for item in list; do ... doneは一覧を一つずつに入れてます。

もっと詳しく in のあとのリストはループが始まる前にされるので、for f in *.txt はテキストファイルごとに一回ずつ回り、$f にその名前が入ります。一致するファイルがないと、パターンそのものが一回だけ使われます($f が *.txt になります)。[[ -e $f ]] で確かめるか、 をオンにしましょう(レッスン9)。$() をループで回すのはやめましょう。名前に空白があるときは、パターンのほうが安全です。

04

seqで決まった回数だけ繰り返す

1 20は1から20までの数を作ります。for i in $(seq 1 20); do ... doneは各数をiに入れて20回ます。「for in 一覧」のinを忘れないでください。範囲が固定ならfor i in {1..20}とも書けます。

もっと詳しく seq は飛ばしながら数えたり、逆に数えたりもできます。seq 0 5 20 は 0 5 10 15 20 を出し、seq 10 -1 1 はカウントダウンします。{1..20} のようなブレースの範囲には変数が使えません({1..$n} は動きません)。終わりが変数で決まるときは、$(seq 1 "$n") か、C 言語風の for ((i=1; i<=n; i++)) を使いましょう。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

for f in *.txt; do echo "$f: $(wc -l < "$f") lines"; done
  1. for f in *.txtこのフォルダーの .txt ファイルごとに一回ずつます。毎回、f にファイル名が一つ入ります。
  2. do繰り返すの始まりです。
  3. echo "$f: …"ファイル名と、そのあとに行数を表示します。
  4. $(wc -l < "$f")そのファイルの行数を数えます。< でファイルを入力として渡すので、 は数字だけを表示します。
  5. doneループの終わり。次のファイルへ進みます。

画面に表示されるもの

notes.txt: 3 lines
todo.txt: 12 lines

ファイルごとに一行ずつ表示されます。ループは .txt ファイルの数だけ回ります。一つもなければ *.txt という文字のまま一回回り、wc がエラーを出します。レッスン9の でこれを防げます。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. for f in *.txt; do wc -l "$f"; done|sort -n

    が出したものは一つの流れになって出てくるので、 -n 一つで全部が並びます。

  2. ls|grep -q txt&&echo "txt here"

    -q は何も出さず成功か失敗かだけを伝えますが、 が見ているのはまさにそれです。

  3. if ls|grep -q todo; then echo "found"; fi

    つないだは if の条件にもなります — 渡すのは文字ではなく成功か失敗です。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • [[ $x > 7 ]]の>は比較です。数値には-gtを使います。
  • [[ と ]] の内側には空白が必要です。
学習目標

このレッスンでできること

  1. 1

    関数を定義して呼び出す

  2. 2

    $1などの引数を使う

  3. 3

    #!/bin/bashを説明する

  4. 4

    を理解する

名札の付いた小さな機械。投入口からファイルが入り、機械はそのファイルと、ラベルを付けたバックアップのコピーを出す。
関数は名前の付いた機械です。引数を渡せば、毎回同じ手順が動きます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. 名前() { 動作; }

    のまとまりに名前を付けます。波かっこが中身を包み、$1 は受け取った最初の値です。

  2. 名前 値

    自分で作ったも他のと同じように呼びます — 名前が先、値が後です。

  3. bash ファイル

    を に渡します。がないファイルでもこれで動きます。

  4. chmod +x ファイル

    +x はこのファイルを実行できると印を付けます。一度やれば済みます。

  5. ./ファイル

    ./ は「すぐここにあるファイル」という意味です。はを探さないからです。

それぞれの枠に入れるもの

ファイル
コマンドが読み書きするファイルです。
値
ただの値ひとつ — 数字や単語、短い文です。
名前
自分で付ける名前です。変数・関数・繰り返しに使います。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

関数の定義と呼び出し

name() { ; }で処理に名前を付け、$1や$2でを受け取ります。

もっと詳しく は定義してから呼び出します。中の$1・$2はその関数に渡された引数です。文字の結果はなどで出力し、result=$(myfunc)で受け取れます。returnは文字を返しません。return 0は成功、return 1など0以外は失敗を知らせます(範囲0〜255)。

02

スクリプトとシバン

複数のをhello.shなどのファイルに保存したものがです。先頭のはシバンと呼ばれ、./hello.shのように直接実行するときにを指定します。今のがzshでもbashで動きます。bash hello.shと実行を直接指定することもできます。

もっと詳しく シバンは必ずいちばん最初の行に置き、正確に #! で始めなければなりません。多くのスクリプトは代わりに #!/usr/bin/env bash を使います。env が bash をインストールされた場所から探してくれるので、bash が /bin にないシステムでも動きます。.sh という末尾は人のための目印にすぎず、どのプログラムがファイルを実行するかを決めるのは名前ではなくシバンです。

03

実行権限と引数

+x hello.shの後に./hello.shを実行します。$1、$2、$@、$#でを読みます。

もっと詳しく ./ は「このフォルダーにあるファイル」という意味です。は に書かれたフォルダーでしかを探さず、今のフォルダーはそこに含まれていないので、hello.sh とだけ打つと 'command not found' になります。 -l で権限を見ると、-rwxr-xr-x には x が含まれているので、そのファイルは実行できます。$0 は自身の名前で、で囲んだ "$@" は、空白を含むものも含めてすべての引数をそのまま渡します。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

backup() { cp "$1" "$1.bak" && echo "saved $1.bak"; }
backup notes.txt
  1. backup()backup というを定義します。
  2. { … ; }関数の本体です。{ のあとの空白と } の前の ; は必須です。
  3. cp "$1" "$1.bak"最初のを、名前の後ろに .bak を付けてコピーします。
  4. && echo …メッセージを表示します。コピーが成功したときだけです。
  5. backup notes.txt関数を呼び出します。関数の中では $1 が notes.txt になります。

画面に表示されるもの

saved notes.txt.bak

1行目は関数を定義するだけで、何も表示しません。2行目が関数を実行してメッセージを表示します。別のファイル名で呼び出せば、同じ手順がそのファイルに対して動きます。それこそが関数を使う意味です。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. bash hello.sh|wc -c

    が出したものも、ほかのの出力とまったく同じように次へ渡せます。

  2. chmod +x hello.sh&&./hello.sh

    動かせるように印を付けて動かすまでを1行で — 後ろは前がうまくいったときだけ起きます。

  3. bash todo.sh|head -1

    が出したもののうち、最初の1行だけ見ます。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • +xがないとになる場合があります。 hello.shでも実行できます。
  • 空白を守るためを"$1"のように囲みます。
学習目標

このレッスンでできること

  1. 1

    で成功・失敗を確認する

  2. 2

    で処理をつなぐ

  3. 3

    forで複数ファイルを処理する

  4. 4

    の予約実行を理解する

ロボットの作業員たちがベルトコンベアで箱を送っています。最初の二つの持ち場の上には緑の信号がついていて箱は先へ進みますが、三つ目の上の赤信号でラインが止まり、監督が身を乗り出してのぞき込みます。
どのも、終わるときに終了コードを残します。0 は緑の信号、それ以外は赤信号です。スクリプトはこれを確かめて、壊れた手順が次の手順まで台無しにする前に止まれます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. コマンド && コマンド

    前のが成功したときだけ、後のコマンドを実行します。

  2. コマンド || コマンド

    前のが失敗したときだけ、後のコマンドを実行します — 非常口です。

  3. コマンド >> ファイル 2>&1

    結果とを1つの記録ファイルにまとめます。

  4. 時刻 コマンド

    の形です — 時刻の5つの枠の後に。自分のパソコンで動き、このでは動きません。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
ファイル
コマンドが読み書きするファイルです。
時刻
いつ実行するか — 分・時・日・月・曜日の5つの枠です。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

終了コードと$?

は成功なら0、失敗なら別の値を返します。で直前の結果を読み、A BはA成功時だけBを実行します。

もっと詳しく 0 以外の終了コードの意味は、ごとに自分で決めています。たとえば は、一致するものがなければ 1、何かがおかしければ 2 を返します。A || B は && の逆で、A が失敗したときだけ B を実行します。 backup || "could not create" のように使います。成功したは exit 0、失敗したスクリプトは exit 1(または別の数)で終わらせましょう。そうすれば、実行した側(人、、別のスクリプト)が結果を確かめられます。

02

繰り返しを自動化

とファイル操作を組み合わせれば、多くのへ同じ処理を自動実行できます。

もっと詳しく ファイルを変える前に、の前にを付けて実行内容を確認しましょう。これをと呼びます。バックアップ名に$(date +%F)を入れると日別になりますが、同じ日の再実行では名前が重なります。実行ごとに残すなら時刻も入れましょう。段階ごとの表示で進み具合が分かります。

03

予約実行 — cron

は決まった時刻にを実行する予約ツールです。crontab -eで設定を開き、「分 時 日 月 曜日」の5欄の後にコマンドを書きます。0 3 * * *は毎日午前3時です。下の予約行はで実行せず、crontabの設定に入れます。

もっと詳しく 五つの欄は、分(0–59)、時(0–23)、日、月、曜日(0 = 日曜日)です。* は「毎」、分の欄の */15 は15分ごと、曜日の欄の 1-5 は月曜日から金曜日までを意味します。cron はとても短い で、なしで動くので、フルを使い、出力はログに送りましょう。そうしないとエラーを見ることができません。crontab -l で今登録されている作業を一覧表示できます。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

*/15 9-18 * * 1-5 /home/you/check.sh >> /home/you/check.log 2>&1
  1. */15分: 15分ごと(0・15・30・45分)。
  2. 9-18時: 9時から18時まで。
  3. * *日と月: いつでも。
  4. 1-5曜日: 月曜日(1)から金曜日(5)まで。
  5. /home/you/check.sh実行するをフルで。 はスクリプトのあるフォルダーではなく、から始まります。
  6. >> /home/you/check.log出力をログファイルの末尾にします。
  7. 2>&1エラーも同じログに送り、あとで読めるようにします。

画面に表示されるもの

何も表示されません。このようなコマンドは、成功すると何も出力しません。

この行はで打つものではありません。crontab -e で保存すると、cron が自動で実行します。平日の 9:00 から 18:45 まで、15分ごとです。には何も表示されないので、check.log を開いて何が起きたかを確かめ、crontab -l で行が保存されたかを確認しましょう。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. mkdir -p logs&&ls>logs/list.txt&&cat logs/list.txt

    三つの手順を、前が成功したときだけ次へ — が事故を起こさないための書き方です。

  2. bash todo.sh>out.txt2>&1&&cat out.txt

    2>&1 がを結果と同じファイルへ送るので、記録一つに全部が残ります。

  3. cat missing.txt||echo "no such file"

    は && の反対側です — 前が失敗したからこそ、この文が出てきます。

つなぐ記号

2>&1
エラーメッセージを結果と同じところへ送ります。
||
前が失敗したときだけ、後ろを動かします。
&&
前が成功したときだけ、後ろを動かします。
>
出力をファイルに書きます。そのファイルにあった中身は消えます。
注意

初心者がよくするミス

  • 重要な処理は exit 1で失敗時に停止します。
  • はで囲みます。 はから始まり、 もとても短いので、とコマンドは絶対パスで書きます。
学習目標

このレッスンでできること

  1. 1

    3種類の引用を説明する

  2. 2

    単語分割とグロビングを理解する

  3. 3

    set -euo pipefailを使う

  4. 4

    を必ず引用する

作業台で、ある人がシュレッダーにつながった大きな赤いボタンを押そうとしています。でもその前に、目のアイコンがあるプレビュー画面と、チェックの入ったチェックリストを見ています。そばでは、紙のメモの束を二つのクランプがはさんでいます。
削除やをするの前には、まず見ましょう — 変わるファイルの一覧を先に出します。クォートは、空白を含む名前がばらばらにならないよう押さえるクランプです。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. コマンド "対象"

    空白が入った名前は、の中でだけ1つになります。引用符がないと2つに見えます。

  2. "$名前"

    二重の中でも $ は値を取り出しますが、値をひとまとまりに保ちます。

  3. '文字'

    一重は「この文字そのまま」という意味です — $ も力を失います。

  4. コマンド -- 対象

    -- の後に来るものはとして読まれません。- で始まる名前を救います。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
名前
自分で付ける名前です。変数・関数・繰り返しに使います。
文字
表示する文です。空白があれば引用符で囲みます。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

3種類の引用

によってののされ方が変わります。

  • "$var"(二重引用符) — 変数は展開しつつ空白を守ります。
  • '$var'(一重引用符) — 中身をすべて文字どおりに残します。
  • 引用なしの $var — 空白で分割され、* のような文字がファイル名に展開されます。

迷ったら二重引用符で囲むのが基本です。

もっと詳しく 簡単に試すと違いが見えます。name="a b" のとき、 $name は a b を表示します(空白が詰められます)が、echo "$name" は a b を表示します。テキストの中にシングルクォートを入れるには、ダブルクォートで囲みます("it's")。ダブルクォートの中で特別な意味を持つのは $・`・"・\ のいくつかの文字だけで、前にバックスラッシュを付ければ守れます。

02

単語分割とグロビング

はのないをまず空白などで分割し、次に*・?を一致するファイル名にします。前者が、後者がです。fileがmy notes.txtなら、 $file backup/は2つのファイルとして読みます。cp "$file" backup/なら1つの名前で渡せます。

もっと詳しく 分割には IFS の文字が使われます。標準では空白・タブ・改行です。そのあとグロビングが *、?、[abc] を一致するファイル名に置き換えるので、* を入れた変数が突然フォルダー内のすべてのファイル名に変わることがあります。どちらも引用符で囲まれていない展開にしか起きず、ダブルクォートの中では決して起きません。

03

防御的オプション

set -euo pipefailはのミスを早く見つける助けになります。各の役割を確認しましょう。

  • -e:の失敗で停止します。ただしifの条件など、結果を検査する場所には例外があります。
  • -u:未設定のを使うとエラーにします。
  • pipefail:途中の失敗も全体のに反映します。

すべてのミスを防げるわけではありません。と実行結果の確認も行いましょう。

もっと詳しく set -euo pipefail はのすぐ次の行に置き、スクリプト全体に効くようにしましょう。shellcheck はマネージャーでインストールします(brew install shellcheck、 apt install shellcheck)。多くのエディターの中で動き、打つそばから間違いに下線を引いてくれます。警告には SC2086(の付け忘れ)のような番号があり、番号ごとに直し方を説明したページがあります。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

cp -- "$src" "$dest/"
  1. cp: コピーします。
  2. --の終わり: -- のあとはすべて名前です。- で始まっていても同じです。
  3. "$src"で囲んだコピー元: 空白を含む名前も一つののままです。
  4. "$dest/"引用符で囲んだコピー先のフォルダー。最後の / で、フォルダーでなければならないことをはっきりさせます。

画面に表示されるもの

何も表示されません。このようなコマンドは、成功すると何も出力しません。

コピーがうまくいくと何も表示されません。引用符がなければ、'my report.txt' のような名前は二つの引数に分かれてしまいます。-- がなければ、- で始まる名前(-r など)がオプションとして読まれます。二つの安全策があれば、中に何が入っていても、それぞれの値がちょうど一つの名前として届きます。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. ls *.txt|wc -l

    が先に星を埋めてくれるので、 -l が数えているのは本物のファイル名です。

  2. wc -l "report 2024.txt"|head -1

    が、空白の入った名前を一つのファイルとして守ります。なければ二つに見えます。

  3. grep 'e' "report 2024.txt"|wc -l

    探す文字は、空白の入った名前はダブルクォートで囲んでから数えます。

つなぐ記号

|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • 多くの事故はの省略から始まります。は常に囲みましょう。
  • では[[ $a = b $c = d ]]の形を使います。
学習目標

このレッスンでできること

  1. 1

    node -vでNode.jsのバージョンを確認する

  2. 2

    node app.jsでJavaScriptファイルを実行する

  3. 3

    npmでパッケージを入れスクリプトを実行する

  4. 4

    npxで導入なしに一度だけ実行する

緑の六角形のエンジンが見えるノートパソコンのターミナル。配送トラックがラベル付きの荷物をプロジェクトフォルダーへ運び込み、そばにチェックリストの紙がある。
Node.js はターミナルで JavaScript を動かし、npm は package.json に書かれたパッケージを届けます。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. node ファイル

    のファイルを Node に渡すと、そのまま実行します。

  2. コマンド オプション

    --version はほとんどの道具で通じるので、インストールを確かめる一番早い方法です。

  3. npm 動作

    は2番目の枠にサブを受け取ります — run・install・init のように。

  4. npm 動作 オプション 対象

    installの後に名を書きます。インターネットにつながったで実行できます。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
ファイル
コマンドが読み書きするファイルです。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

Node.jsとは?

はブラウザの外(・)でを動かす()です。Webページを作るツール、ターミナルで使うツール、、多くのがNode上で動きます。の次に覚えると開発ツール導入が楽になります。

もっと詳しく Node.js は Chrome と同じ JavaScript エンジン(V8)を使います。ただし、Web ページを表示する代わりに、ファイルを読み書きしたり、ネットワークにつないだり、ほかのプログラムを実行したりします。偶数番号のバージョン(22・24 など)は、何年も修正が届く LTS(長期保守)版になるので、学ぶときには安全な選択です。nodejs.org からインストールするか、 を使います(発展テーマを参照)。

02

nodeコマンド

-v(または--version)で版を確認します。node app.jsはファイル実行、node -e "console.log(1+1)"は一行実行です。

もっと詳しく node とだけ打つと が開きます。 を一行ずつすぐに実行する対話型の(>)で、.exit か Ctrl+D で抜けます。は process.argv でを読めます。node greet.js Mina なら、process.argv[2] は "Mina" です。console.log はに書くので、Node のもほかのと同じようにに組み込めます(node report.js | total)。

03

npmとpackage.json

は再利用できるの集まり、を管理します。package.jsonには名前・版、必要なパッケージ(dependencies)、実行する()があります。そのフォルダでnpm installするとパッケージを取得し、npm run startでstartを実行します。ならにインストールせずにパッケージのコマンドを実行できます。

もっと詳しく npm install は二つのものを作ります。_modules はダウンロードしたコードです。とても大きくなることが多く、編集ももしません。 は、インストールした正確なバージョンの一覧です。全員が同じものを使えるように、これはコミットします。npm ci はロックファイルに書かれたとおりに入れるので、自動ではこれを使います。^4.17.21 のようなバージョンは「このバージョンか、互換性のあるもっと新しいバージョン」という意味です。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

npm install --save-dev prettier
  1. npm に付いてくるマネージャーです。
  2. installパッケージをダウンロードして、プロジェクトに追加します。
  3. --save-devdevDependencies に記録します。開発中には必要でも、アプリの実行時には要らないものです。短く書くと -D です。
  4. prettierパッケージ名。ここではをきれいに整える道具 Prettier です。

画面に表示されるもの

added 1 package, and audited 2 packages in 2s
found 0 vulnerabilities

は追加したパッケージの数を知らせ(一つのパッケージがほかのパッケージを連れてくることもあります)、簡単なセキュリティ検査(audit)を行います。これで package.json の devDependencies に prettier が載り、 prettier --write . でプロジェクトに使えます。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. node app.js|wc -l

    Node が出したものもただの文字なので、はほかと同じように数えられます。

  2. cat package.json|grep name

    ファイルを読んで、自分が見たい行だけを残します。

  3. node --version&&npm --version

    確認を二つ1行で。前の道具が本当にあるときだけ後ろが動きます。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • やが not foundなら未インストールです。nodejs.orgかで入れ、を開き直してください。
  • npm install -gは権限・セキュリティ問題を招きやすいです。nvmを使うか、sudoなしで入れられるよう設定してください。
学習目標

このレッスンでできること

  1. 1

    多くのツール導入の前提がだと説明する

  2. 2

    Claude Code・Codex・Grok・の代表的な導入コマンドを知る

  3. 3

    導入(-g)と一度きり実行()を区別する

  4. 4

    導入後にバージョン確認する習慣を持つ

覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. コマンド オプション

    道具にバージョンを尋ねて、本当に入っているか確かめます。

  2. command -v コマンド

    そのがあればを表示し、なければ何も表示しません。

  3. コマンド 動作 オプション 対象

    インストールの行はたいていこの形です — 道具、サブ、、。自分のパソコンで使いましょう。

  4. curl オプション 値 -o ファイル

    から取得し、-oの後のファイルに保存します。でもインターネット接続があれば実行できます。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
ファイル
コマンドが読み書きするファイルです。
値
ただの値ひとつ — 数字や単語、短い文です。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

なぜターミナルにツールを入れるのか

現代の開発はエディタだけでは終わりません。次のようなツールがで動きます。

  • — Grok Build、OpenAI Codex、Claude Code
  • — Firebase tools
  • マネージャ — pnpm など

レッスン10で学んだ Node・ がその出発点です。

もっと詳しく こうしたツールの多くはアカウントが必要です。で一度ログインすれば( login など)、ツールが覚えていてくれます。どれも にあるふつうのなので、このコースで扱ったこと(、、)はすべてそのまま使えます。AI コーディングエージェントはを代わりに実行してくれるので、コマンドが何をするのかを理解することは、重要でなくなるどころか、もっと重要になります。

02

代表的な導入(短い要約)

公式手順は変わるので、常に公式ドキュメントを優先してください。一般的な出発点は次のとおりです。

  • Claude Code: -fsSL ://claude.ai/install.sh | (または install -g @anthropic-ai/claude-)
  • OpenAI Codex: curl -fsSL https://chatgpt.com/codex/install.sh | sh(または npm install -g @openai/codex)
  • Grok Build: 公式インストーラ、または npm install -g @xai-official/grok
  • : npm install -g firebase-tools

導入後は claude --version、codex --version、firebase --version のようにバージョンを確認します。

もっと詳しく インストール直後にが見つからなければ、新しいを開きましょう。更新されたが反映される場合があります。手動で設定を読み直すなら、zshは~/.zshrc、bashは~/.bashrcなど、今のに合うファイルを使います。更新はインストール時の方法で行います。npmの例はnpm install -g firebase-tools@latest、削除はnpm uninstall -gの後に名です。

03

安全に入れる習慣

| は信頼できる公式からだけ。で権限エラーならよりを直します。チーム・ではで版を固定すると安全です。

もっと詳しく インストーラーはダウンロードして、実行する前に中身を読みましょう。curl -fsSL -o install.sh で保存し、less install.sh で読んでから、bash install.sh で実行します。-fsSL のうち、-f はのエラーで止まり、-s は静かにし、-S はそれでもエラーは表示し、-L は転送先のアドレスをたどります。適当な動画や掲示板にある curl | bash の行を貼り付けてはいけません。ツールの公式サイトからコピーしましょう。

もっと詳しく

一行を部品ごとに読む

実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。

curl -fsSL https://claude.ai/install.sh -o install.sh
  1. curlWeb のアドレスからダウンロードします。
  2. -fsSL四つの短いをまとめたもの。のエラーで失敗する、静かにする、それでもエラーは表示する、転送先をたどる、の四つです。
  3. https://claude.ai/install.shインストーラーの公式アドレスです。
  4. -o install.shすぐに実行せず、ファイルに保存します。

画面に表示されるもの

何も表示されません。このようなコマンドは、成功すると何も出力しません。

ダウンロードがうまくいくと何も表示されません。less install.sh で読んでから、 install.sh で実行しましょう。-o install.sh の代わりに | bash を使うと、は中身を見ることもないまま、すぐに実行されてしまいます。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. cat tools.md|grep -i git|head -3

    読んで、 の話がある行だけ残し(-i はを区別しません)、そのうち3行だけ見ます。

  2. which bash&&bash --version|head -1

    まずがあるかを探し、それからバージョンを尋ねます。

  3. ls|sort|head -2

    いちばん素朴なつなぎです — 並べて、並べ替えて、切る。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • 出所不明な | は危険です。公式か確認してください。
  • 似た名前でもは違います。@anthropic-ai/claude-、@openai/codex、のように正確な名前を使います。
学習目標

このレッスンでできること

  1. 1

    -cや -eで他の言語を一行実行できる

  2. 2

    をファイルに保存してpython3 ファイル.pyで実行できる

  3. 3

    ヒアドキュメント(<<PY)で複数行のプログラムをに渡せる

  4. 4

    sedでファイルのテキストを一括修正できる

  5. 5

    awkで表形式データから取り出し集計できる

  6. 6

    AIが書いたを実行する前に安全に確認できる

覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. awk '{動作}' ファイル

    は行ごとに書いた動作を実行します。$1 は最初の列です。

  2. awk '条件 {動作}' ファイル

    波かっこの前に条件を置くと、一致する行だけが動作を受けます。

  3. sed 's/探す文字/値/' ファイル

    s は置き換えです — これを探して、あれにする。斜線は枠を区切る線として読みましょう。

  4. python3 ファイル

    .py ファイルを に渡すと、そのまま動きます。

  5. python3 -c '動作'

    -c はファイルなしに、その場で を1行実行します。

それぞれの枠に入れるもの

ファイル
コマンドが読み書きするファイルです。
探す文字
照らし合わせる文字や形です。引用符で囲んでシェルに触らせません。
値
ただの値ひとつ — 数字や単語、短い文です。
条件
判断する検査です。真か偽のどちらかになります。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

シェルは演奏者ではなく指揮者です

だけですべて計算しようとするとすぐ壁にぶつかります。シェルは「誰をいつ呼ぶか」を決める指揮者です。計算やデータは、表の集計は、テキストの一括修正はに任せ、シェルはその結果をつなぎます。シェルが分かれば、学んだことのない言語も呼び出して使えます。

02

一行だけ渡す — -cと-e

多くの言語は「をで受け取ってすぐ実行する」を持っています。は -c "コード"、は -e "コード"、Perlは -e、Rubyはruby -eです。電卓の代わりにpython3 -c "print(2**10)"と打つ習慣だけで、は格段に強力になります。

03

ファイルに保存して実行する

一度きりでないはファイルに保存します。hello.py にを書いておけば、 hello.py でそのまま実行できます。

レッスン7で学んだを使うと、もっと簡単です。

  • ファイルの1行目に #!/usr/bin/env python3 と書きます。
  • +x hello.py でを与えます。
  • これで python3 を前に付けずに、./hello.py だけで動きます。

実行後に と打てば、成功(0)か失敗(1)かが分かります。だからレッスン8のとおり、 で次のにつなげられます。

04

複数行を渡す — ヒアドキュメント

複数行のをまとめて渡すにはを使います。 - <<'PY'の次の行からコードを書き、最後の行にPYだけを書きます。の間の内容がPythonに渡ります。-はファイルではなくからコードを読む指定です。コーディングもこの形で複数行を実行します。

05

<<'PY'と<<PYは違います

をで囲むと(<<'PY')本文がそのまま渡ります。囲まないと(<<PY)本文の$や$()をが先に置き換えます。に$はあまり出ませんが、やに$があると静かに壊れるので、コードを渡すときは囲む形が基本です。

06

sed — 探して置き換えるストリームエディター

で文字を置き換える基本の形は s/探す/置き換える/ です。

  • sed 's/探す/置き換える/' — 各行で最初に見つかった一つを置き換えます。
  • 末尾に g を付けると(s/…/…/g)、その行のすべてを置き換えます。
  • 前に行番号や // を付けると、の行を選べます(2s/…/…/、/error/s/…/…/)。
  • -n と p を組み合わせると、選んだ行だけ出力します。
  • は / でなくてもかまいません。の置換は s|/old/path|/new/path| のように書くと、ずっと読みやすくなります。

ファイル自体を書き換えるときは sed -i.bak 's/探す/置き換える/' ファイル のように書きます。元のファイルを ファイル.bak として残すので安全です(macOSとの違いは下の「注意」を見てください)。

07

awk — 表を扱う小さなプログラミング言語

は表形式の文字を扱う小さな言語でありです。行を空白で分け、最初の欄を$1、次を$2と呼びます。NFは欄の数、NRは行番号です。awk 'パターン { 処理 }'で行と処理を指定します。パターンを省くと全行、処理を省くと一致行を表示します。BEGINは読み始める前、ENDは読み終えた後に1回動き、準備や合計に使えます。

08

パイプで言語をつなぐ

から受け取り標準出力へ流す同士は、で自由につなげます。たとえば sales.txt | '{print $2}' | -n | -3 は、一行で次のことをします。

  • ファイルを読む
  • 2だけを取る
  • 数値で並べる
  • 大きい3つだけを残す

awk・ はこうしてパイプでつなぎ、 は -c やでを渡すのが基本です。これがは指揮者だという言葉の本当の意味です。

09

AIが書いたコードを安全に実行する

はたいていこのの形で答えます。貼り付ける前に三つだけ確認しましょう。①どのファイルを触るのかを目で読む。②rmや>でする箇所がないか見る。③大事なファイルなら 元 元.bakで先にバックアップを取る。を読めるということは、AIの答えを検証できるということです。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. awk '{print $1}' sales.txt|sort|uniq -c

    が1を取り出し、 が同じ行をまとめ、 -c がまとまりごとに数えます。

  2. python3 hello.py|wc -c

    が出し、が数える — お互いのことを何も知らなくてかまいません。

  3. sed 's/=/ /' config.txt|awk '{print $1}'

    が = を空白に変えるので、 が名前を1として読めるようになります。

つなぐ記号

|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • のは必ずで囲んでください。ダブルクォートだと$1をが自分のと勘違いして空にしてしまいます。awk '{print $1}'は動きますが、awk "{print $1}"は正しく動きません。
  • の終了タグは行の先頭に、前後に空白なしで同じ文字を正確に書く必要があります。字下げしたい場合は<<-を使い、タブで字下げします。
  • を渡すときは<<'PY'のようにタグを引用符で囲むのが基本です。囲まないとコード内の$がシェル変数に置き換わり、静かに壊れます。
  • -iはファイルを元に戻せない形で書き換えます。まず-iなしで実行し画面で結果を確認してから付けましょう。
  • macOSでsed -i 's/…/…/' ファイルのようにバックアップ名なしで打つとエラーになり(ファイル名によってinvalid codeなど)、ファイルはそのままです。macOSのsedは-iの後に名前を要求するからです。sed -i.bakの形で書けば、macOSでもでも同じコマンドが通ります。
  • sed 's/a/b/' file > fileのように読むファイルと書くファイルを同じにすると、ファイルが先に空になり内容が消えます。
学習目標

このレッスンでできること

  1. 1

    . * + ? [ ] ^ $ などの基本記号でテキストの形を表せる

  2. 2

    grep -Eで一致する行を探し、-oで一致した部分だけを取り出せる

  3. 3

    sed -Eとでテキストの順序を入れ替えたり直したりできる

  4. 4

    との違い、そしてgrep -Eで\dが数字にならない理由を説明できる

  5. 5

    シェルスクリプトの[[ 値 =~ パターン ]]とPythonのreモジュールで値をチェックできる

  6. 6

    macOS・Linux・Windowsに標準で入っている正規表現コマンドを選んで使える

いろいろな形が並んだ長いリボンが、星と丸がくり抜かれた型紙カードの下を流れていきます。型に合う紫の星と丸が光り、磁石がそれを弧を描いて持ち上げてかごに入れます。灰色の形はそのまま残ります。
正規表現は文字のための型紙です。grep はそれを一行ずつ重ねて、パターンに合う部分だけを取り出します。
覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. grep -E '探す文字' ファイル

    -E はより広い形の文法を有効にします。そこでは | が「または」です。

  2. grep -oE '探す文字' ファイル

    -o は行全体ではなく、一致した部分だけを表示します。

  3. sed -E 's/探す文字/値/g' ファイル

    g は1行の中で一致したものを最初だけでなく全部置き換えます。

  4. [[ 値 =~ 探す文字 ]]

    =~ は の中で値と形を直接照らし合わせます。

それぞれの枠に入れるもの

ファイル
コマンドが読み書きするファイルです。
探す文字
照らし合わせる文字や形です。引用符で囲んでシェルに触らせません。
値
ただの値ひとつ — 数字や単語、短い文です。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

正規表現はテキストの「形」を表す

010-1234-5678を検索すると、その番号だけが見つかります。同じ3桁・4桁・4桁の形なら[0-9]{3}-[0-9]{4}-[0-9]{4}と書きます。[0-9]は数字1つ、{3}は3回のです。こうした検索規則がです。・・・vim・・・PHPでも基本記号は似ていますが、細かな文法は確認しましょう。

02

1文字を選ぶ記号

.は任意の1文字です(a.cはabcにもa1cにも一致)。[abc]は角かっこの中のどれか1文字、[^abc]はその中にない1文字、[a-z]や[0-9]は範囲内の1文字です。よく使う集まりには短い名前があります。\dは数字、\wは単語の文字(英字・数字・_)、\sは空白です。大文字(\D \W \S)はその逆を意味します。のツールでは[[:digit:]]や[[:space:]]のようなの名前も使えます。

03

回数を表す記号

*は直前の文字の0回以上、+は1回以上、?は0回か1回(colou?rはcolorにもcolourにも一致)、{n}はちょうどn回、{n,m}はn回からm回です。の記号は、すぐ前の1文字(または1つの角かっこ・)にだけかかります。また、繰り返しはできるだけ多く取ろうとします()。".*"は行の最初のから最後の引用符まで全部取ってしまうので、1組の引用符の中だけにしたいときは"[^"]*"と書きます。

04

位置を表す記号 — ^ $ \b

^は行の先頭、$は行の末尾です。^errorはerrorで始まる行、done$はdoneで終わる行、^$は空行に一致します。\bは単語の境界なので、\bart\bはartを見つけますがpartyには一致しません。これらの記号は文字を消費せず、位置だけを示します。角かっこの先頭にある^([^0-9])は「〜以外」という意味で、まったく別物なので混同しないようにしましょう。

05

グループと「または」 — ( ) |

red|blueはredまたはblueです。( )は複数の文字をひとまとまりにします — (ab)+はab、abab、ababababに一致します。を使うと、見つけた部分を取り出すこともできます。では\1 \2、では${BASH_REMATCH[1]}、ではm.group(1)です。だから2026-10-15を15.10.2026に変えるのも1行で済みます。

06

記号をただの文字として使う — エスケープ

. * + ? ( ) [ ] { } ^ $ | \ にはすべて特別な意味があります。その文字そのものを探したいときは、前に\を付けます。ドットは\.、アスタリスクは\*、開きかっこは\(です。192.168.0.1をそのまま書くと、それぞれの.が「任意の1文字」になるので192x168y0z1にも一致してしまいます。また、ではパターンを必ずで囲みましょう。そうしないと、に渡る前にシェルが* ? $ { }を独自に変えてしまいます。

07

基本文法と拡張文法 — -Eを付ける理由

とで出会うの文法は三つあります。

  • — grepとsedが何も指定しないときに読む文法です。+ ? | ( ) { }はただの文字なので、機能として使うには\+ \| \(のようにバックスラッシュを付けて書きます。
  • — -E(grep -E、sed -E)を付けると、記号をそのまま書けます。迷ったら必ず-Eを付けましょう。
  • (PCRE) — \dのような記号を使います。そのためgrep -Eでは、\dは数字ではなく文字dです。

のツールでは[0-9]と書き、どうしても\dを使いたいときはgrep -P()を使います。・・PHP・ (rg)は最初から\dを理解します。

08

macOS・Linux・Windowsに標準で入っているコマンド

macOS と には ・・・find・ が最初から入っています。ただし OS ごとに少しずつ違います。

  • macOS — grep・sed は 版です。grep -P がなく、\s の代わりに [[:space:]] と書き、ファイルを編集するときは sed -i の後に '' を付けます。
  • Linux — GNU 版なので、-P・\s・\+ がすべて使えます。
  • Windows — には 、 には ・-match・-replace があります。PowerShell は \d をそのまま理解します。 や を入れれば grep・sed も使えます。

下の「OS別の標準」の表に例をまとめました。

09

シェルスクリプトとPythonで正規表現を使う

では [[ $value =~ パターン ]] で値をチェックします。

  • 一致すれば真になるので、 でつないだり if で使ったりできます。
  • ( ) で囲んだ部分は ${BASH_REMATCH[1]} に入ります。
  • パターンをで囲むと、ただのとして比べてしまいます。だからパターンは引用符なしで書くか、re='…' のようにに入れて [[ $value =~ $re ]] と使います。

では import re をして、下のを使います。パターンは r"\d+" のように、前に r を付けた raw 文字列で書きます。

  • re.search — 探す
  • re.findall — すべて探す
  • re.sub — 置き換える
  • re.fullmatch — 全体をチェック
前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. grep -E "ERROR|WARN" app.log|wc -l

    注意 — の中の | は にとって「または」で、外にある | がをつなぐ記号です。

  2. grep -o "user=[a-z]*" app.log|sort|uniq -c

    合った部分だけ取り出して並べ替え、それぞれ何回出てくるかを数えます。

  3. python3 regex.py|head -3

    が出したもののうち、先頭の3行だけ見ます。

つなぐ記号

|
出力を次のコマンドに渡します。間にファイルはありません。
ひと目でわかる

正規表現の記号表

よく使う記号の意味、例、その例に一致するテキストをまとめました。例をクリックすると下のテスターに入り、動きを確かめられます。

記号 意味 例 一致する例
. 任意の1文字 abc · a1c
* 直前の文字を0回以上 ac · abbc
+ 直前の文字を1回以上 abc · abbc
? 直前の文字を0回か1回 color · colour
{n,m} n回からm回繰り返す 12 · 2026
^ 行の先頭 error: disk full
$ 行の末尾 all done
[abc] 角かっこの中のどれか1文字 a · e
[^abc] 角かっこの中にない1文字 x · -
[a-z] 範囲内の1文字 Q · k
| または red · blue
( ) 複数の文字をひとまとまりにする ab · abab
\ 記号をただの文字として使う(エスケープ) .

短縮記号

記号 同じ意味 意味 例
\d [0-9] 数字1文字 2026
\w [A-Za-z0-9_] 単語の文字1つ(英字・数字・_) user_1
\s [ \t\n] 空白文字1つ(スペース・タブ・改行) a b
\D \W \S [^0-9] … それぞれの逆 — 数字・単語の文字・空白以外 abc
\b \< \> 単語の境界 — \bart\bはartを見つけ、partyは飛ばす art
[[:space:]] \s POSIXの名前 — macOSを含め、どこのgrepとsedでも動く安全な書き方 42
BRE · ERE · PCRE

基本文法と拡張文法

とは何も指定しないとで読むので、+ ? | ( ) { }を機能として使うには前に\が必要です。-Eを付けるとになり、記号をそのまま書けます。

機能 基本 — grep、sed 拡張 — grep -E、sed -E
1回以上 \+ +
0回か1回 \? ?
または a\|b a|b
グループ \( \) ( )
n回からm回繰り返す \{n,m\} {n,m}

記号をそのまま書く方法 grep -E sed -E awk [[ =~ ]] grep -P vim \v

\d \w \sはの記号です。grep -Eでは\dは数字ではなく文字dなので、[0-9]と書きましょう。\dが必要なときはgrep -P()、、を使います。macOSのgrepとsedでは、\sより[[:space:]]のほうが安全です。

自分のパソコンで

OS別の標準コマンド

何もインストールせずにすぐ使えるです。タブで自分のOSを選びましょう。

  • grep -E パターンに一致する行を探す(なので-Pはなし) grep -E 'ERROR|WARN' app.log
  • sed -E 探して置き換える — ファイルを編集するときは-iの後に''が必要 sed -E -i '' 's/[[:space:]]+$//' notes.txt
  • awk 一致した行から必要なを表示 awk '/ERROR/ {print $1, $3}' app.log
  • find -E でファイル名を探す(-Eで) find -E . -regex '.*\.(jpg|png)'
  • perl \dを使ったの置き換え — 最初から入っている perl -pe 's/(\d+)-(\d+)/$2-$1/g' a.txt
  • zsh [[ =~ ]] macOSの標準で値をチェック [[ $v =~ ^[0-9]+$ ]] && echo number
  • python3 のreモジュール — 初回はのインストールを求められることがある python3 -c "import re; print(re.findall(r'\d+', 'a1b22'))"

macOSの標準シェルはzshで、とはBSD版です。とまったく同じように動かしたいときは、brew install grep gnu-sedでGNU版(ggrep、gsed)を入れましょう。

  • grep -E · -P · -o — -Pで\d、-oで一致した部分だけ grep -Po '\d{4}-\d{2}-\d{2}' app.log
  • sed -E -i ファイルをその場で編集 — GNU は\sや\+も理解する sed -E -i 's/\s+$//' notes.txt
  • awk 列()にの条件を付ける awk -F: '$1 ~ /^www/' /etc/passwd
  • find -regex 正規表現でファイルのを探す find . -regextype posix-extended -regex '.*\.(php|js)'
  • bash [[ =~ ]] 値をチェックし、をから取り出す [[ $s =~ ([0-9]+) ]] && echo "${BASH_REMATCH[1]}"
  • git grep の中だけを素早く検索 git grep -n -E 'TODO|FIXME'
  • python3 ほとんどのディストリビューションに入っている python3 -c "import re; print(re.sub(r'\s+', ' ', 'a b'))"

のgrepとsedはGNU版なので、このレッスンのとまったく同じように動きます。

  • findstr で検索 — の一部だけ(+ ? |なし) findstr /R /N "^ERROR" app.log
  • Select-String の — パターンに一致する行を探す Select-String -Path app.log -Pattern 'ERROR|WARN'
  • -match 一致すれば真。は$Matchesに入る '2026-10-15' -match '^\d{4}-\d{2}-\d{2}$'
  • -replace 探して置き換える — \dや\sをそのまま理解する (Get-Content a.txt) -replace '\s+$', '' | Set-Content a.txt
  • [regex]::Matches 一致するものをすべて探す [regex]::Matches('a1b22', '\d+').Value
  • Where-Object 正規表現でファイル名を選ぶ Get-ChildItem | Where-Object Name -match '\.(jpg|png)$'
  • WSL · Git Bash や を入れるとのがそのまま使える wsl grep -E 'ERROR|WARN' app.log
  • py をインストールしたらpyで実行 py -c "import re; print(re.findall(r'\d+', 'a1b22'))"

PowerShellは.NETの正規表現を使うので、\d \w \sや( )グループがそのまま使えます。コマンドプロンプトのはできることがずっと少ないので、PowerShellがおすすめです。

ひと目でわかる

よく使う実用パターン

コピーしてすぐ使えるパターンです。クリックするとテスターに入り、どこに一致するか確かめられます。

練習ウィンドウ

正規表現テスター

パターンを変えると、下のテキストの一致する部分がすぐに光ります。テキストも自由に書き換えてみましょう。

一致とグループ

このテスターはのを使い、の文法と完全には同じではありません。例えば\dはここでは数字ですが、 -Eでは[0-9]を使います。grep -Pに移す場合も実際の結果を確認しましょう。

注意

初心者がよくするミス

  • パターンは必ずで囲みましょう。 -E [0-9]{1,3}のようにそのまま書くと、が{1,3}を1と3にし、*や?をファイル名に変えてしまいます。
  • grepはで始まるので、grep 'a|b'の|はただの文字です。または(|)・+・?を機能として使うにはgrep -Eを付けましょう。
  • grep -Eや -Eでは\dは数字ではありません(文字dです)。シェルのツールでは[0-9]を使い、どうしても\dが必要ならgrep -Pかを使いましょう。
  • .は「任意の1文字」です。ドットを探すには\.と書きます。192.168.0.1をそのまま書くと192x168y0z1にも一致します。
  • シェルのツールの角かっこの中では、\はただの文字です。[^\s]は「\とs以外の1文字」になるので、空白以外の文字は[^[:space:]]か[^ ]と書きましょう。
  • .*はできるだけ多く取ります。1組の引用符の中だけに一致させたいときは、"[^"]*"のように「その文字以外」で範囲を絞りましょう。
  • [[ $v =~ "^[0-9]+$" ]]のようにパターンを引用符で囲むと、はではなくただのとして比べます。引用符なしで書くか、(re='…')に入れましょう。
  • macOSのsedとgrepはなので、\s・\+・grep -Pが使えないことがあります。-Eと[[:space:]]を使えば、同じがmacOSでもでも動きます。
学習目標

このレッスンでできること

  1. 1

    どんなコマンドも枠で読める — 何を、どうやって、何に対して

  2. 2

    オプションの4つの形を見分けられる — -l・--all・-la・-n 5

  3. 3

    対象の枠にを使い、シェルが先に埋めることを知る

  4. 4

    初めて見るコマンドのパターンを --help と man で自分で調べられる

覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. コマンド オプション 対象

    ひとつだけ覚えるならこの形です — 何を、どうやって、何に対して。

  2. コマンド --help

    ほとんどのがここで自分のパターンを教えてくれます。初めて見るコマンドを身につける道です。

  3. コマンド オプション 対象 どこへ

    は元の、コピー先の順です。引数が2つのすべてのが同じとは限らないため、各位置の役割を確認しましょう。

  4. コマンド 探す文字

    の枠の * はが先に埋めます。だからは本当のファイル名しか見ません。

  5. コマンド オプション | コマンド オプション

    両側がそれぞれ自分の形を守り、は結果だけを渡します。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
どこへ
結果が置かれる場所 — 新しい場所か、新しい名前です。
探す文字
照らし合わせる文字や形です。引用符で囲んでシェルに触らせません。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

どのコマンドにも3つの枠がある

私たちが打つほとんどの行は、・・の順です。 -la photos は「一覧を見る(ls)、詳しくまで(-la)、photos フォルダー」という意味です。コマンドはいつも先頭に来て、手を付けるものは最後に来ます。枠が見えてくれば長い行も怖くありません — ひと枠ずつ区切って読めばよいのです。

02

オプションの4つの形

は動作方法を指定します。短いものはハイフン1つ(-l)、長いものは2つ(--all)で始まります。の-laは-l -aをまとめた形です。-n 5や--output report.txtのように値を受け取るものもあります。まず「・オプション・」の順で読み、必要な指定やまとめ方はヘルプで確認しましょう。

03

対象の枠とワイルドカード

にはファイルやフォルダのを書きます。・は元の対象より後に移動先を書きます。ファイル名の*は0文字以上、?は1文字、[0-9]は数字1つに一致します。が先に一致する名前へして渡します。{a,b}は別の展開で、ファイルの有無に関係なくaとbの2つの名前を作ります。

04

つなぐことと包むこと

は記号でつながります — | は結果を次のコマンドへ渡し、> はファイルに書き、>> はファイルの末尾に書き足し、 は成功した後だけ、|| は失敗した後だけ、; はそのまま次を実行します。包む印は4つだけです — "..." は文をひとまとまりに、$(...) はコマンドの結果を差し込み、$((...)) は計算し、[[...]] は条件を調べます。まとまりは開く語と閉じる語が対です — if は fi、for は done、{ は }。

05

初めて見るコマンドを調べる

を覚える必要はありません。名前の後ろに --help を付けるか、man と名前を打って最初の行を読めば、そこにパターンが書いてあります。その行で角かっこ [ ] は「省いてよい」、... は「いくつも書いてよい」という意味で、そのまま書かれた単語が自分で埋める枠です。またすべてのコマンドは成功を 0 で知らせ、 $? で見られます。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. ls *.txt|wc -l

    の枠、そして、そして自分の枠を持つ別の — 両側が同じ骨組みです。

  2. ls --help|head -5

    は最初の行に自分のパターンを書いているので、そのヘルプを に流します。

  3. cat notes.txt report.txt|wc -l

    の枠に入れた二つのファイルが一つの流れになり、行数は二つ合わせて数えます。

つなぐ記号

|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • はの前に置きます。 photos -la は では動くこともありますが、どこでも動くわけではないので、・オプション・対象の順を守りましょう。
  • に触らせたくない形はで囲みます。 *.txt notes.txt はシェルが先に *.txt を置き換えてしまい、grep "*.txt" notes.txt はアスタリスクをそのまま grep に渡します。
  • 枠を区切るのは空白なので、空白が入ったファイル名は対象2つに見えます。引用符で囲みましょう — -l "report 2024.txt"。
学習目標

このレッスンでできること

  1. 1

    でディスクとパーティションを見つけ、パーティション・・マウントポイントとは何かを説明する

  2. 2

    空のディスクを でパーティションに分け、 でフォーマットし、 でつなぐ

  3. 3

    -h で空き容量を確かめ、新しいディスクにファイルを書いて、安全に取り外す

  4. 4

    curl と git clone でインターネットからダウンロードする

  5. 5

    マネージャーでプログラムをインストールする — システムには apk、 には の中の pip、Node プロジェクトには npm

覚えるのではなく、枠で読む

このレッスンのコマンドパターン

どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。

  1. lsblk 対象

    を付けると、 はそのディスクとその中のだけを見せます。

  2. sudo mkfs.ext4 対象

    はディスク全体ではなくです。そして中身はすべて消えます。

  3. sudo mount 対象 どこへ

    先に何をつなぐか、次にどこへつなぐか。つまりデバイス、それからフォルダーです。

  4. curl オプション 値

    -s は を静かにさせ、-I はヘッダーだけを頼みます。値はWebアドレスです。

  5. コマンド 動作 名前

    マネージャーはみな同じ形です。マネージャー・すること・パッケージ — add、 install、 install。

それぞれの枠に入れるもの

コマンド
何をするか — コマンドの名前です。いつも先頭に来ます。
オプション
どうするかを決めます。- か -- で始まり、省いてもよく、いくつも並べられます。
対象
何に対してするか — ファイルやフォルダーの名前、またはパスです。
どこへ
結果が置かれる場所 — 新しい場所か、新しい名前です。
値
ただの値ひとつ — 数字や単語、短い文です。
名前
自分で付ける名前です。変数・関数・繰り返しに使います。
動作
順番が来たら実行するコマンドです。
基本概念

重要な概念を学ぶ

試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。

01

ディスクは白紙のノート — lsblk で見てみる

はすべてのディスクを /dev の下のファイルとして扱います。(list block devices)はそれを木の形で描きます。

  • sda は1台目のディスクです。ここでは空の128MBの練習用ディスクです。
  • sda1、sda2 … はその中のです。今はまだひとつもありません。
  • sr0 はCDドライブで、TYPE には disk・part・rom のどれかが出ます。

lsblk は見るだけで何も変えないので、いつも最初の一歩です。このレッスンを開くたび、または「セッションをリセット」を押すたびに、ディスクはまた空に戻ります。好きなだけ練習しましょう。

02

パーティション — ノートに線を引く

とは、ディスクの中で独立したドライブのように働く区画です。ディスクのいちばん最初にあるパーティションテーブルが、それぞれの区画がどこから始まりどこで終わるかを記録します。それを書くのが です。mklabel msdos は新しい空のテーブルを作り、mkpart primary ext4 1MiB 100% は 1MiB からディスクの終わりまでのパーティションをひとつ加えます。-s は「質問しない」という意味です。ディスクを変えるのは管理者の仕事なので、は で始めます。そのあと を見ると、sda の下に sda1 が出ます。

03

フォーマット — パーティションにファイルシステムを与える

新しいはまだただの空き地で、ファイルを入れられません。フォーマットすると、そこにが書き込まれます。ファイルシステムとは、すべてのファイルの名前、データの置き場所、持ち主を覚えている目録です。 は でふつうに使う ext4 を作ります。mkfs.vfat は Windows や macOS でも読める FAT を作ります(USBーに向いています)。フォーマットすると、そのパーティションにあったものはすべて消えます。

04

マウント — ディスクをフォルダーにつなぐ

はC:・D:の代わりにディスクをフォルダへ接続します。これがマウントで、接続先はマウントポイントです。 /dev/sda1 /mnt/dataの後、/mnt/dataのファイルはsda1に保存されます。 -hで容量を確認しましょう。新しいはroot所有なのでsudo で書くか、sudo chown you /mnt/dataで所有者を変えます。最後にsudo umount /mnt/dataで解除します。

05

curl — ターミナルからWebアドレスを開く

( )は画面のないWebです。ブラウザーにアドレスを入れると、ブラウザーはにリクエスト( リクエスト)を送り、サーバーはレスポンスを返します。レスポンスには、(200 は OK、404 は見つからない、301 と 302 は別のアドレスに移った、500 はサーバーの失敗という意味です)、ヘッダー(中身の種類や大きさなどの情報)、そして本文(・・ファイル)が入っています。ブラウザーは本文をページとして描きますが、curl は届いたままをに見せるか、ファイルに保存します。だから curl は、サーバーが生きているかを確かめるとき、ファイルをダウンロードするとき、 を呼ぶときに使います。 よく使う:

  • curl アドレス — 本文を画面に表示する
  • -o ファイル — 自分で決めた名前で保存する。-O — アドレスにある名前で保存する
  • -L — 移った先のアドレス(301 と 302)についていく
  • -I — ヘッダーだけを聞く(本文はもらわない)
  • -s — 進行バーを隠す。-S — それでもエラーは見せる。-f — サーバーが 404 や 500 のようなエラーで答えたら失敗として終わる( 22)
  • -w "%{http_}" — 最後にステータスコードを表示する

インストールのでよく見る -fsSL は、この4つのオプションをまとめたものです。curl が受け取ったものは、でほかのコマンドに渡せます。| なら最初の数行だけ、| なら JSON のひとつの項目だけです。この は SONUB のネットワーク中継サーバーを通って本物のインターネットとやり取りします。エミュレーターなので、ダウンロードには数秒かかることがあります。

06

git clone — プロジェクトをまるごとコピーする

clone は、 のようなーからプロジェクトをコピーします。すべてのファイルと、その履歴もまるごとです。 はファイルをひとつ取ってきますが、git clone はフォルダー全体を取ってきます。--depth 1 を付けると最新の版だけを取るので、ずっと速くなります。できたフォルダーに で入り、 で見て回りましょう。この はエミュレーターなので、ダウンロードには数秒から数十秒かかります。

07

パッケージマネージャー — apk でプログラムをインストール

マネージャーは、文字を打って使うアプリストアです。を探し、それに必要なものといっしょにダウンロードして、インストールしてくれます。システムごとに自分のものがあります。

  • Alpine (この):
  • Ubuntu と Debian: apt
  • macOS: brew(Homebrew)

apk add figlet でプログラムをインストールし、apk search で探し、sudo apk del で削除します。

08

Python のパッケージ — venv の中で pip

はPyPIからを入れます。まずvenvを作り、システムのPythonと分けましょう。 -m venv ~/venvで作り、source ~/venv/bin/activateで有効にします。(venv)が表示されたらpip installで中に入れ、終了時はdeactivateを使います。この実習では作成に約1分かかります。外にはpipがなく not foundになります。システム保護環境ではexternally-managed-environmentが出る場合もあります。

09

Node のパッケージ — プロジェクトフォルダーで npm install

はプロジェクトごとにをインストールします。空のフォルダーで npm init -y を打つと、プロジェクトに必要なものの一覧である package.json ができます。npm install ms はパッケージを _modules にダウンロードし、package.json に書き込みます。だから後で誰でも、ただの npm install で同じ環境を作り直せます。プロジェクトごとに自分の node_modules を持つので、2つのプロジェクトがバージョンを取り合うことはありません。

前のコマンドが次のコマンドに渡す

コマンドをつなぐ

を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。

  1. lsblk|grep sda

    がすべてのディスクとを見せ、 が練習用ディスク sda の行だけを残します。

  2. sudo mkdir -p /mnt/data&&sudo mount /dev/sda1 /mnt/data

    フォルダーが本当に作れたときだけディスクをつなぎます — は「それができたときだけ」という意味です。

  3. curl -s https://sonub.com/robots.txt|head -3

    がインターネットからファイルを取ってきて、 -3 がその最初の3行だけを見せます。

つなぐ記号

&&
前が成功したときだけ、後ろを動かします。
|
出力を次のコマンドに渡します。間にファイルはありません。
注意

初心者がよくするミス

  • は指定したの中身をすべて消します。ここでは空の練習用ディスクですが、自分のパソコンでは /dev/sda がシステムの動いているディスクかもしれません。必ず先に で名前を確かめましょう。
  • なしだと、・mkfs・ は や must be superuser で止まります。ディスクを変えるのは管理者の仕事です。
  • そのフォルダーの中にいる間は、umount は is busy と答えます。先に ~ してから取り外しましょう。
  • の外では install は失敗します。ここでは pip: not found、Ubuntu では externally-managed-environment になります。--break-system- で無理に押し通さず、venv を作ってオンにしましょう。
  • ここでは ping の返事はエミュレーター自身から来るので、インターネットがつながっている証拠にはなりません。代わりに で確かめましょう。
  • ここで作ったもの — パーティション・ファイル・インストールした — は、レッスンを開き直すか「セッションをリセット」を押すとすべて消えます。大事な作業は自分のパソコンでしましょう。
🚀 発展学習 — さらに深く

ユーザー入力を受け取る

ユーザーに値をたずねて、に入れます。変数を前もって宣言しておく必要はありません。

echo "名前は何ですか?"# 質問を画面に表示
read name# 答えを変数 name に読み込む
echo "こんにちは、$name!"# 受け取った値を使う

read はユーザーが Enter を押すまで待ち、打ち込まれた内容を変数に入れます。-p を付けると質問を同じ行に表示し(read -p "Name? " name)、-s は暗証番号を打つときのように入力した文字を隠し、-r はバックスラッシュをそのまま残します。変数名を渡さなければ、答えは $REPLY に入ります。

現在地とサブシェル

の代わりに、 $PWD でもが分かります。かっこ ( ) で囲んだコマンドは別ので動くので、その中で しても外の現在地は変わりません。

echo "今いる場所は $PWD です"# で現在のを使う
(cd /tmp; pwd)# サブシェルの中だけで移動 → /tmp を表示
pwd# 外は元の場所のまま

サブシェルは今ののコピーです。その中で変えたこと(cd や新しい変数)は終わると消えるので、(cd build make) は自分の居場所を動かさずに別のフォルダーでします。の各部分もサブシェルで動くため、パイプのあとの while の中で設定した変数は、ループが終わると空になっています(レッスン4のがこれを解決します)。

画面整理とヘルプ

clear(または Ctrl-L)で画面を片付けます。知らないは三種類のヘルプで調べます — 組み込みコマンドは help、マニュアルは man、詳しい文書は info です。

clear# の画面を消す(Ctrl-L と同じ)
help for# for のような組み込みコマンドのヘルプ
man ls# のマニュアルページ(q で終わる)

help が知っているのは の組み込みコマンド(・for・read)だけです。ls のようなは man で調べます。man の中では矢印キーや Space で移動し、/ に続けて言葉を打つと検索、q で終わります。さっと確認したいときは、多くのコマンドが --help で短い要約を表示します。type は、その名前が組み込みコマンドか、プログラムか、エイリアスかを教えてくれます(type cd、type ls)。

チャレンジ

自分のコンピューターので、三つのを使って三つのことを調べましょう。今いるフォルダー、も含めたの中身、そして がの組み込みコマンドかどうかです。

ヒント 、次に隠しファイル用のと ~ を付けた 、最後に type。

解答例を見る
pwd
ls -A ~
type cd

-A は隠しファイルを表示しますが . と .. は除くので、本当の項目だけが並びます。type cd は 'cd is a shell builtin' と答えます。cd がシェルそのものの一部なのは、別のでは、自分を起動したシェルのフォルダーを変えられないからです。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

ブレース展開

は{ }内の一覧や範囲を複数の名前にします。file{1..5}.txtならfile1.txtからfile5.txtまでの5つです。それをやに渡すと、複数のフォルダやファイルを一度に作れます。

mkdir -p project/{src,tests,docs}# 三つのフォルダーを一度に作る
touch file{1..5}.txt# file1.txt から file5.txt まで五つのファイルを作る
cp config.yaml{,.bak}# バックアップの小技 — config.yaml → config.yaml.bak

シェルはを実行する前にブレースを展開するので、コマンド自身はブレースを見ません。 file{1..3}.txt は file1.txt file2.txt file3.txt を表示するので、パターンを前もって確かめる安全な方法になります。範囲は文字でも使えます({a..e})。ブレースの中に空白を入れてはいけません。{a, b} は展開されません。

安全に削除する

で消したものは元に戻せません。-i(一つずつ確認する)と -v(消したものを表示する)でうっかりミスを減らせます。trash- を使えば、代わりにゴミ箱へ送ります。

rm -i old.txt# 消す前に、本当に消すかたずねる
rm -v *.tmp# 何を消したかを表示する
rm -r tempDir/# フォルダーと中身をすべて消す(注意!)

は rm を危険にします。rm *.tmp は大丈夫ですが、空白が一つ余計に入った rm * .tmp はフォルダーの中のファイルをすべて消してしまいます(-r がないので、サブフォルダーだけが残ります)。まず同じパターンで を実行し(echo *.tmp)、何が消えるのかを正確に見ましょう。rmdir は空のフォルダーしか消さないので、空のはずのフォルダーなら rm -r より安全な選択です。

便利なlsオプション

はで並べ方と表示の形を変えます。次の三つは覚えておく価値があります。

ls -l# 一行に一つずつ、詳しく
ls -t# 最近変更したものから順に
ls -R# すべての(再帰的)

オプションは組み合わせられます。ls -lt は新しいファイルから順に詳しく、ls -lS はサイズ順に表示し、-h を加えるとサイズをではなく K・M・G で表示します(ls -lhS)。大きなプロジェクトでは ls -R が何千行も出力することがあります。フォルダーだけを見たいなら、find . -type d のほうが読みやすいです。

チャレンジ

project というフォルダーを作り、その中に src・tests・docs フォルダーと、空の README.md を作りましょう。README.md を docs にコピーし、そのコピーの名前を guide.md に変え、最後に全体の構成を表示してください。

ヒント ブレースを使えば三つのフォルダーを一行で作れます。一歩ごとに で確かめましょう。

解答例を見る
mkdir -p project/{src,tests,docs}
touch project/README.md
cp project/README.md project/docs/
mv project/docs/README.md project/docs/guide.md
ls -R project

-p は project と三つのフォルダーをまとめて作ります。フォルダーの中へコピーすると名前はそのままなので、 で guide.md に変えるまで、コピーは docs/README.md です。ls -R はすべてのフォルダーとその中身を一覧表示するので、結果をひと目で確かめられます。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

grepの追加オプション

はを使うとずっと強力になります。検索・行番号・除外・数え上げを組み合わせます。

grep -r "TODO" ./src# -r: フォルダー全体を再帰的に検索
grep -n "error" app.log# -n: 行番号付きで
grep -v "debug" app.log# -v: その言葉がない行だけ(逆)
grep -c "error" app.log# -c: 何行あるかだけ

オプションは組み合わせられます。grep -rnw "total" . は、今のフォルダー以下のすべてのファイルから単語全体が一致する行を、行番号付きで探します。-l は一致したファイルの名前だけを表示するので、ファイルを開く前に便利です。-A 2 と -B 2 は一致した行の後ろ・前の二行ずつも表示するので、ログの中でエラーの直前・直後に何が起きたかが分かります。

sedでストリーム編集

はファイルを1行ずつ読み、文字を置き換えたり行を選んで表示したりします。通常、元のファイルは変わりません。-iを付けるとファイル自体を変更するため、下の例のように-i.bakでバックアップを残しましょう。

sed 's/okay/great/g' file.txt# すべての okay を great に
sed '/^#/d' file.txt# # で始まる行を消す
sed -i.bak 's/old/new/g' file.txt# ファイルそのものを書き換え + .bak のバックアップ
sed -n '/error/p' log.txt# error を含む行だけ表示

sed は一度に一行ずつ読み、を当てはめて結果を表示します。ファイルそのものが変わるのは -i を付けたときだけです。s/old/new/g の g は、その行で一致したものをすべて置き換えるという意味で、なければ最初の一つだけが置き換わります。Mac の sed -i にはバックアップの末尾に付ける値が必要で(付けないなら sed -i '' …)、 とは違います。こうした違いはレッスン13でさらに見ていきます。

awkで列を処理

は各行を空白(または -F で指定した文字)で分け、それぞれを列 $1、$2 … として扱います。合計・絞り込み・集計が得意です。

echo 'a b c' | awk '{print $2}'# 2 → b
awk -F',' '{print $3}' data.csv# カンマで分けて 3 列目
awk -F',' '$2 > 25' people.csv# 2 列目が 25 より大きい行
awk '{s+=$1} END{print s}' nums.txt# 1 列目の合計

awk は行ごとにを実行します。前に置いたパターン($2 > 25)が行を選び、ブレースの中の部分がその行で何をするかを決めます。NR は行番号、NF は列の数なので、awk 'NR > 1' は見出しの行を飛ばします。END ブロックは最後の行のあとに一度だけ動くので、合計や平均にぴったりです。awk '{s+=$1} END {print s/NR}' は1列目の平均を表示します。

cut・sort・uniq・xargs

小さな道具をでつなぐと、強力なデータ処理ができます。 は、前のの出力を次のコマンドのに変えます。

cut -d ',' -f 1 file.csv# カンマの 1 だけ
sort file.txt | uniq -c# 並べ替えてから重複を数える
find . -name "*.tmp" | xargs rm -f# 見つけたファイルを に渡して消す
find . -name "*.txt" -print0 | xargs -0 rm# 空白を含むファイル名でも安全(-0)

定番のパイプラインで、何かが何回現れるかを数えられます。cut -d' ' -f1 access.log | | -c | sort -rn | は、1列目でいちばん多く現れる値を10個表示します。xargs は入力からコマンドを組み立てます。-n 1 を付けると項目ごとに一回ずつ実行し、find -print0 と一緒に -0 を使えば、空白を含む名前も安全に渡せます。

find をもっと — サイズや日付で探し、見つけたものごとにコマンドを実行

名前のほかに、find はサイズ・最終更新日時・深さでも選べ、見つけたものごとにを実行できます。条件を複数書くと、すべてに合うものだけが選ばれます。

find . -type f -size +10M# 10 MB より大きいファイル
find . -name "*.log" -mtime +30# 最終更新が 30 日より前のログファイル
find . -maxdepth 1 -type f# 今いるフォルダーのファイルだけ(サブフォルダーには入らない)
find . -name "*.tmp" -exec rm {} \;# 見つけたファイルごとに を実行({} にが入る)

-size では + が「より大きい」、- が「より小さい」を表すので、-size +10M は 10 MB より大きいファイルです(c は、k・M・G はキロ・メガ・ギガバイト)。-mtime -7 は 7 日以内に変更したもの、-mtime +30 は 30 日より前に変更したもので、分単位なら -mmin を使います。条件のあいだには見えない「かつ」(-a)があり、-o は「または」、! は「否定」です。\( -name "*.jpg" -o -name "*.png" \) のようにかっこでまとめるときは、に横取りされないよう \ を前に付けます。-exec を \; で終えると見つけたものごとに一回ずつコマンドを実行し、+ は多くをまとめて一回で実行するので速くなります。-delete と -exec rm は元に戻せないので、まず動作を付けずに同じ条件で実行して一覧を確かめ、それから動作を付けましょう。

チャレンジ

names.txt には一行に一つずつ名前があり、何度も出てくる名前もあります。名前ごとに一回ずつ、出てきた回数と一緒に、多いものから順に表示してください。

ヒント は隣り合った行しかまとめません。まず しましょう。それから数値で、もう一度 sort します。

解答例を見る
sort names.txt | uniq -c | sort -rn

sort が同じ名前を隣に集め、uniq -c がそれをまとめて前に回数を書き、sort -rn がその数で大きい順に並べます(-n は数値として、-r は逆順)。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

ヒアドキュメントと文字列

<< EOF()は、複数行のテキストをひとまとめにしての入力に渡します。<<<()は、短い一行を入れる手軽な方法です。

cat << EOF# EOF までの行が入力になる
複数行の テキスト EOF# 二つの EOF のあいだが中身
grep "バナナ" <<< "りんご バナナ ぶどう"# <<< で一行を入力

<< のあとの言葉は目印にすぎず、EOF は習慣であって決まりではありません。<<'EOF' のように目印をで囲むと、中身が文字どおりに扱われ($HOME は $HOME のまま)、をファイルに書き出すときにぴったりです。 > config.txt << EOF … EOF は、数行の小さなファイルを手早く作る方法です。

標準エラーと/dev/null

(stdout)と標準エラー(stderr)は別々の通り道を通ります。2> はエラーだけを、2>&1 はエラーを出力と同じ場所へ送ります。/dev/null は捨てる場所です。

command 2> error.log# だけをファイルへ
command > out.log 2>&1# 出力とエラーをまとめて out.log へ
command > /dev/null 2>&1# 出力もエラーも捨てる(静かに実行)

順番が大事です。 > out.log 2>&1 は両方のストリームをファイルへ送りますが、command 2>&1 > out.log はそうなりません。2>&1 は、その時点でふつうの出力が向いていた先(まだ画面)をコピーするからです。 では &> out.log が > out.log 2>&1 の短い書き方です。意味の分かっている雑音を /dev/null で隠すのはかまいませんが、エラーを全部隠すと問題が見つけにくくなります。

プロセス置換

<() は、コマンドの出力をまるでファイルのように渡します。二つのコマンドの結果を、一時ファイルなしでそのまま比べるときに便利です。

diff <(ls dir1) <(ls dir2)# 二つのフォルダーの一覧をそのまま比べる
while read l; do echo "$l"; done < <(ls)# の中で設定したが、ループの後も残る

<( ) はコマンドを実行し、その出力に /dev/fd/63 のような一時的なファイル名を付けます。そのため、ファイル名しか受け取らない(diff・comm・paste)でも読めます。 と zsh の機能で、素の sh にはないので、は で始める必要があります。二つ目の例が大事なのは、のあとの while ループがで動くからです。< <(…) を使えばループは自分ので動き、変数が残ります。

コマンド置換

$() は、コマンドの結果を値のように文の中にはめ込みます。バッククォート(`)より $( ) を使いましょう — 入れ子にできます。

echo "ここには $(ls | wc -l) 個のファイルがあります"# ファイルの数を文にはめ込む
today=$(date +%Y-%m-%d)# 今日の日付をに入れる

$( ) はまずコマンドを実行し、その出力を最後の改行を除いてその場所に入れます。結果に空白が含まれるかもしれないときは "$()" のようにで囲みましょう。$( "$()") のようにバックスラッシュなしで入れ子にできることが、バッククォートに代わって使われるようになったいちばんの理由です。

チャレンジ

今のフォルダーのファイル一覧を画面で見ながら、同時に files.txt に保存してください。次に files.txt の最後に 'checked' という行を追加し、files.txt の今の行数を数字だけ表示してください。

ヒント は表示と保存を同時に行い、>> は末尾にし、< は にファイルを入力として渡します。

解答例を見る
ls | tee files.txt
echo "checked" >> files.txt
wc -l < files.txt

tee は一覧を画面と files.txt に同時に書きます。>> はせずに追記します。wc -l < files.txt はファイルをとして読むので、wc はファイル名を知らず、数字だけを表示します。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

パラメーター展開

${ } の中では、値を取り出すと同時に、その一部を切り取ったり置き換えたりできます。の値を加工するいちばん強力な道具です。

echo "${var/Some/A}"# 最初の Some を A に置き換える
echo "${var//Some/A}"# // ならすべての Some を A に置き換える
echo "${var:0:7}"# 0 番目から 7 文字だけ(部分)
echo "${#var}"# 文字列の長さ

${var/old/new} は、その一回だけ値を変えて使います。結果を代入し直さない限り(var="${var//-/_}")、変数そのものは変わりません。パターンはではなくのパターンなので、* は「任意の文字列」です。こうしたは別のを使わず の中で行われるため、の中で を呼ぶよりずっと速いです。

デフォルト値と大文字小文字

が空のときのデフォルト値を決めたり、大文字と小文字を一度に変えたりできます。

echo "${foo:-デフォルト値}"# foo が空なら「デフォルト値」を代わりに使う
: "${NAME:=ゲスト}"# NAME がなければ「ゲスト」を入れて、そのまま残す
echo "${var^^}"# すべて大文字( 4 以降)
echo "${var,,}"# すべて小文字

:- はその場だけ値を補い、:= は変数にも保存し、:? は値がないときにあなたのメッセージを出してを止めます(レッスン8)。コロンが大事です。コロンなし(${foo-x})だと、変数が空のときではなく、存在しないときにだけデフォルト値が使われます。^^ と ,, には bash 4 が必要です。macOS に付いてくる bash は 3.2 なので、頼る前にそちらで試しましょう。

パスを切り出す

${var#pattern}は先頭から、${var%pattern}は末尾から一致部分を削ります。#・%が1つなら最短、##・%%なら最長の一致を削ります。下の例でファイル名とフォルダのを取り出してみましょう。

path="/usr/local/bin/run.sh"# 例のパス
echo "${path##*/}"# 最後の / までを消す → run.sh ()
echo "${path%/*}"# 最後の / から後ろを消す → /usr/local/bin (dirname)
echo "${path%.sh}"# .sh だけを消す

# は左から、% は右から切ると覚えましょう(キーボードでは # が % の左にあります)。記号一つは最短の一致を切り、二つは最長の一致を切ります。file=archive.tar.gz なら、${file%.*} は archive.tar、${file%%.*} は archive になります。basename と dirname も同じことをしますが、毎回別のを起動します。

配列

かっこの中に複数の値を入れ、[番号] で一つを、[@] ですべてを取り出します。${#array[@]} で個数を数えます。

array=(りんご バナナ ぶどう)# 三つの値を持つを作る
echo "${array[0]}"# 1 つ目 → りんご(番号は 0 から)
echo "${array[@]}"# 全部 → りんご バナナ ぶどう
echo "${#array[@]}"# 個数 → 3

では必ず付きで "${array[@]}" と書きましょう。項目に空白が含まれていても、一つずつ丸ごと残ります。項目は array+=(cherry) で追加し、番号の一覧は ${!array[@]} で見られます。配列は の機能なので素の sh にはなく、zsh は1から数えます。そのため同じでも動きが変わることがあります。

連想配列

-A で作る連想は、「名前 → 値」の組で値をしまいます(ほかの言語の辞書やマップのようなものです)。

declare -A person# 連想配列を宣言する
person[name]="花子"# 名札 name に値をしまう
echo "${person[name]}"# 取り出す → 花子
for k in "${!person[@]}"; do echo "$k"; done# すべてのキーを順にたどる

declare -A は欠かせません。付け忘れると は person をふつうの配列として扱い、すべての名前が黙って 0 になってしまいます。でのキーの順番は保証されないので、順番が大事ならキーを並べ替えましょう。連想配列には bash 4 以降が必要なので、macOS に付いてくる bash では使えません。

組み込み変数と算術

があらかじめ値を入れておくがあります。は $(( )) の中で行い、べき乗や余りも計算できます。小数の計算には を使います。

echo "$?"# 直前のの(0 = 成功)
echo "$RANDOM"# 0 から 32767 までの乱数
echo "$(( 2 ** 10 ))"# べき乗 → 1024
echo "scale=2; 10/3" | bc# 小数の計算 → 3.33

$? はコマンドのたびに変わるので、あとで使うならすぐに保存しましょう(status=$?)。ほかにも便利なものがあります。$$ はのプロセス番号、$0 はの名前、$SECONDS はシェルが動いている時間、$LINENO は現在の行番号です。$RANDOM はゲームには十分ですが、暗証番号や秘密の鍵には向きません。秘密にする値には openssl rand のようなきちんとした生成ツールを使いましょう。

printfによる書式出力

はシステムによって動きが少しずつ違います。 はどこでも同じように動き、桁数・そろえ方・小数点以下の桁を正確に決められます。

printf "こんにちは、%s!\n" "世界"# %s の場所に値が入る → こんにちは、世界!
printf "%.2f\n" 3.14159# 小数第 2 位まで → 3.14
printf "%05d\n" 42# 0 で埋めて 5 桁に → 00042

printf は自分では改行しないので、書式の最後に \n を付けます。プレースホルダーより多くの値を渡すと書式が繰り返されるので、printf "%s\n" a b c は三行を表示します。リストを表示するすっきりした方法です。%-10s は文字を幅10文字の列に左寄せするので、簡単な表の列がそろいます。

チャレンジ

file には report.final.pdf が入っています。だけを使って、を除いた名前、拡張子だけ、そして名前全体を大文字で表示してください。

ヒント % は右から切り、## は左からできるだけ長く切り、^^ は大文字にします。

解答例を見る
file="report.final.pdf"
echo "${file%.*}"
echo "${file##*.}"
echo "${file^^}"

${file%.*} は右から最短の「.何か」を取り除いて report.final になります。${file##*.} は最後のドットまでをすべて取り除いて pdf になります。${file^^} はすべての文字を大文字に変えます( 4 以降)。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

caseで分岐

一つの値をたくさんのパターンと比べるときは、if を何度も重ねるより case のほうがすっきりします(ほかの言語の switch に似ています)。

case "$x" in# x の値によってする
0) echo "ゼロ";;# 0 のとき
1) echo "いち";;# 1 のとき
*) echo "それ以外";; esac# * はそれ以外のすべてに一致する

パターンごとに yes|y|Y) のように | で選択肢を並べられ、ファイル名と同じも使えます。*.jpg|*.png) は画像ファイルの名前に一致します。最初に一致したパターンが選ばれて残りは飛ばされるので、何でも受け止める *) は最後に置きましょう。;; は各選択肢の終わりを示します。これを忘れるのが case でいちばん多い間違いです。

for・while・until

for は一覧や範囲を順にたどり、while は条件が真のあいだ、until は条件が偽のあいだます。C 言語風の for もあります。

for ((i=1; i<=3; i++)); do echo "$i"; done# C 言語風の for
while (( count < 3 )); do ((count++)); done# 条件が真のあいだ
until (( count >= 3 )); do ((count++)); done# 条件が偽のあいだ

while は、入力を一行ずつ読むとき(while read -r line; do … done < file)や、何かの準備ができるまで待つときに自然な選択です。break はループを途中で抜け、continue は次の回へ飛びます。終わりのない while true ループには出口が必要です。break か、手で動かしているなら Ctrl+C です。

正規表現とファイル検査

=~ は、がのパターンに合うかを調べます。-e・-f・-d などは、ファイルやフォルダーがあるか、どんな種類かを確かめます。

if [[ "$email" =~ ^[a-z]+@[a-z]+\. ]]; then echo 一致; fi# 正規表現で照合する
if [[ -f "$file" ]]; then echo "ファイルあり"; fi# -f: 普通のファイルか
if [[ -d "$dir" ]]; then echo "フォルダーあり"; fi# -d: フォルダーか
if [[ -z "$name" ]]; then echo "空です"; fi# -z: 空か

=~ の右側のパターンはなしで書きます。引用符で囲むとただの文字列になってしまいます。かっこで囲んだ部分は に保存されるので、部分を取り出せます。[[ $d =~ ([0-9]+)-([0-9]+) ]] のあとでは、${BASH_REMATCH[1]} が最初の数です。ファイルの検査はほかにもあります: -s(空でない)、-r・-w・-x(読める・書ける・実行できる)、-nt(より新しい)。

チャレンジ

1から15までの数でを回し、3の倍数なら Fizz、5の倍数なら Buzz、両方の倍数なら FizzBuzz、それ以外は数そのものを表示してください。

ヒント % は割り算の余りを出します。余りが 0 なら「割り切れる」という意味です。どの検査を先にすべきか考えてみましょう。

解答例を見る
for i in {1..15}; do
  if (( i % 15 == 0 )); then echo "FizzBuzz"
  elif (( i % 3 == 0 )); then echo "Fizz"
  elif (( i % 5 == 0 )); then echo "Buzz"
  else echo "$i"
  fi
done

(( i % 3 == 0 )) は i が3で割り切れるときに真になります。if/elif は最初に真になった検査で止まるので、15 の検査を先に置きます。そうしないと 15 は Fizz で止まってしまいます。それ以外の数は else までたどり着き、そのまま表示されます。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

変数のスコープ

local はの中だけで使うを、 は変えられない定数を作ります。declare は整数(-i)・小文字(-l)・大文字(-u)のような性質を決めます。

greet() { local msg="こんにちは"; echo "$msg $1"; }# msg は関数の外からは見えない
readonly PI=3.14# 変えられない定数
declare -i num=42; num+=10# 整数型 → 計算が自動で行われる(52)
declare -u up="hi"; echo "$up"# いつも大文字 → HI

local を付けないと、関数の中で設定した変数はすべて全体で共有され、ほかの場所にある同じ名前の変数をしてしまうことがあります。見つけにくいバグです。関数の中では local を基本にしましょう。readonly は決して変わってはいけない値を守り、変えようとするとエラーが表示されます。declare -p name は変数がどう定義されているかを表示するので、に役立ちます。

getoptsでオプション処理

が -v や -f ファイル名 のようなを受け取れるようにする標準の道具です。文字の後ろのコロン(:)は「このオプションには値が必要」という意味です。

while getopts ":vf:" opt; do# v は値なし、f は値が必要
case $opt in# オプションごとにする
v) verbose=true ;;# -v なら verbose をオンにする
f) file="$OPTARG" ;; esac; done# -f の値は に入る

":vf:" の先頭の : は、静かなエラー処理をオンにします。知らないオプションなら opt に ? が入り、値が足りなければ : が入るので、自分のヘルプメッセージを表示できます。 が扱えるのは短いオプション(-v)だけで、長いオプション(--verbose)は自分で読み取る必要があります。のあとで shift $((OPTIND - 1)) を実行するとオプションが取り除かれ、$1 が最初の本当のになります。

sourceとexport

source(または .)は、別のファイルを現在ので実行して、そのや設定を読み込みます。export はをにも渡します。

source ./lib/helpers.sh# 別のファイルの関数と変数を現在のシェルに読み込む
. ~/.bashrc# . は source の短い書き方
export API_KEY="abc123"# 子プロセスからも見えるようにする

をふつうに実行すると新しいシェルが始まるので、終わるとその変数や は消えます。source は今のシェルで実行するので、~/.bashrc を編集したあとに読み込み直すときに使います。export は変数に印を付け、このシェルから起動したがそれを受け取れるようにします。逆はできません。子は親の変数を変えられないのです。のような秘密は、共有したり にしたりしないファイルに置きましょう。

チャレンジ

受け取った名前ごとにあいさつする greet を書きましょう。空白を含む名前("Mina Kim")は一つにまとめたままにし、名前を一つも受け取らなかったときは 'Usage: greet NAME...' と表示して失敗を報告するようにします。

ヒント $# はの数、return 1 は失敗の報告、で囲んだ "$@" は各引数を丸ごと保ちます。

解答例を見る
greet() {
  if (( $# == 0 )); then echo "Usage: greet NAME..."; return 1; fi
  local name
  for name in "$@"; do echo "Hello, $name!"; done
}
greet Leo "Mina Kim"

(( $# == 0 )) が名前なしの呼び出しを捕まえます。local は name を関数の中だけに閉じ込めます。"$@" は Leo と Mina Kim を二つの引数として渡すので、関数は二行を表示します。引用符がなければ三行になってしまいます。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

trapで後片付け

trap は、が(終了・エラー・中断)を受け取ったときに実行するを決めます。一時ファイルの後片付けに特に便利です。

TMP=$(mktemp)# 安全な一時ファイルを作る
cleanup() { rm -f "$TMP"; }# 後片付けの
trap cleanup EXIT# スクリプトが終わるとき、必ず後片付けする
trap 'echo 中断しました; exit 1' SIGINT# Ctrl-C を押されても安全に

EXIT は、スクリプトが終わるたびに が発生させる、シグナルのような出来事です。ふつうに終わっても、exit で終わっても、set -e で止まっても起こるので、trap 一つですべての出口をカバーできます。ERR はコマンドが失敗するたびに動くので、行番号($LINENO)を表示するのに便利です。mktemp は重ならない名前でファイルを作るので、同じスクリプトが同時に二つ動いても、互いの一時ファイルをしません。

防御的なsetオプション

の先頭に set のを置くと、エラーに強くなります。-e(エラーで止まる)・-u(未設定のを許さない)・-o pipefail(の失敗に気づく)を一緒に使います。-x は用です。

set -euo pipefail# 丈夫なスクリプトの定番の 1 行目
set -x# 実行するを一つずつ表示(デバッグ)
set +x# デバッグをやめる

set -e には例外があります。if の条件の中、 や || のリストの中、結果を検査しているコマンドで失敗しても止まりません。すでにその失敗を扱っているからです。失敗しても害のないコマンドは || true で許可できます。set -x はデバッグしている部分の周りだけでオンにすると、トレースが短く済みます。

バックグラウンドとwait

の後ろに & を付けると、で実行します。jobs で一覧を見て、wait で終わるまで待ちます。

sleep 5 &# バックグラウンドで実行
jobs# まだ動いているバックグラウンドジョブの一覧
wait# すべてのバックグラウンドジョブが終わるまで待つ
time sleep 1# コマンドにかかった時間を測る

& を付けるとすぐにが戻り、ジョブ番号とプロセス ID が表示されます。fg はバックグラウンドのジョブを前に戻し、Ctrl+Z は実行中のジョブを一時停止し、bg はそれをバックグラウンドで再開します。バックグラウンドのジョブはふつう、を閉じると止まります。ログアウト後も動かし続けるには、nohup command & や のようなツールを使います。

安全パターン

実際ので何度も出てくる守りの型です — 必要な値を確かめる、があるか確かめる、失敗したらすぐ止める。

: "${VAR:?VAR が必要です}"# VAR がなければエラーを出して止まる
command -v jq && echo "jq あり"# コマンドがインストールされているか確かめる
cp a b || { echo 失敗; exit 1; }# 失敗したらメッセージを出して止まる

command -v は、ツールがあるかを確かめる、どこでも通じる方法です。答えだけが欲しいなら出力は捨てましょう(command -v > { "please install jq"; exit 1; })。こうした確認はスクリプトの先頭に置きましょう。そうすれば作業の途中ではなく、始まってすぐに分かりやすいメッセージとともに失敗します。複数のコマンドは { …; } でまとめます。空白と最後の ; は必須です。

チャレンジ

backup.sh を書きましょう。今のフォルダーのすべての .txt ファイルを backup-YYYY-MM-DD(今日の日付)という名前のフォルダーにコピーし、コピーが失敗したらを出して止まり、.txt ファイルがなければ何も言わずに飛ばし、最後にいくつコピーしたかを表示します。

ヒント 先頭に set -euo pipefail、名前には date +%F、for 、そして のあとに { …; exit 1; }。

解答例を見る
#!/bin/bash
set -euo pipefail
dest="backup-$(date +%F)"
mkdir -p "$dest"
count=0
for f in *.txt; do
  [[ -e "$f" ]] || continue
  cp "$f" "$dest/" || { echo "copy failed: $f" >&2; exit 1; }
  count=$(( count + 1 ))
done
echo "copied $count file(s) to $dest"

date +%F で一日一つのフォルダーになり、 -p はフォルダーがすでにあっても文句を言いません。[[ -e "$f" ]] || continue は、*.txt に何も一致しなかったときにループを飛ばします。>&2 はエラーメッセージをへ送ります。((count++)) ではなく count=$(( count + 1 )) を使っています。((count++)) は count が 0 のとき「失敗」を返し、set -e のを止めてしまうからです。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

setオプションを理解

set -euo pipefail は三つのを合わせたものです。それぞれがどんな事故を防ぐのかが分かると、なぜ定番になったのかが見えてきます。

set -e# どれか一つでもが失敗したら、すぐに止まる
set -u# 定義していないを使うとエラー(打ち間違いを見つける)
set -o pipefail# の途中の一段が失敗したら、パイプ全体を失敗にする

-e だけでは、パイプの途中の失敗を見逃します。false | true は成功とみなされます。パイプはふつう最後のコマンドの結果しか報告しないからです。pipefail を付けると、どこか一部が失敗すればパイプ全体が失敗になります。-u は $flie のような打ち間違いを捕まえます。そうしないと黙って空になり、 -rf "$dir/$flie" が $dir の中身をすべて消す危険な行になってしまいます。

shoptでグロビング調整

は、ファイル名の照合()のしかたを調整します。globstar は ** を届かせ、nullglob は何も一致しないとき空の値にします。

shopt -s globstar# ** がサブフォルダーの中まで一致する( 4 以降)
for f in **/*.sh; do echo "$f"; done# すべてのサブフォルダーにある .sh ファイル
shopt -s nullglob# 一致しないとき、パターンの文字ではなく空の値になる

shopt -s はをオンに、shopt -u はオフにします。shopt だけを打つとすべての一覧が出ます。nullglob をオンにすると、テキストファイルがないとき for f in *.txt は *.txt という文字で一回回る代わりに、何もしません。dotglob は * にも含め、nocaseglob はファイルのパターンでを無視します。globstar には bash 4 が必要です。

IFSと安全な行読み込み

(内部)は、単語分割でどこを区切るかを決めます。ファイルを一行ずつ安全に読むには、IFS= と read -r を一緒に使います。

IFS=',' read -ra f <<< "a,b,c"# カンマで分けて f に入れる
while IFS= read -r line; do# 空白や特殊文字をそのまま残す
echo "$line"; done < file.txt# 一行ずつ安全に読む

read -r はバックスラッシュをそのまま残し、IFS= は read が行の先頭と末尾の空白を削るのを止めます。ファイルの最後の行の末尾に改行がないと、ふつうの while read はその行を落としてしまいます。read のあとに [[ -n $line ]] を付ければ拾えます。IFS は一つののためだけに設定しましょう(IFS=',' read …)。そうすれば、のほかの部分に影響しません。

チャレンジ

あるが -rf $LOGDIR/*.log で古いログを消しています。LOGDIR が空でも、設定されていなくても、空白を含んでいても安全で、しかもフォルダーを決して消さないように書き直してください。

ヒント ${VAR:?message} は値がないと止まります。はで囲み、* は引用符の外に置きます。

解答例を見る
set -u
: "${LOGDIR:?LOGDIR is not set}"
rm -f -- "$LOGDIR"/*.log

LOGDIR が空だったら、元の行は rm -rf /*.log になってしまいます。:? は代わりにメッセージを出してスクリプトを止めます。引用符は空白を含むフォルダー名を一つにまとめ、* は引用符の外にあるので、ちゃんとファイルに一致します。-- は - で始まる名前から守り、-r のない -f はフォルダーを決して消しません。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

nvmでバージョン管理

プロジェクトによって、必要な Node のバージョンが違うことがあります。 で複数のバージョンをインストールし、切り替えます。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash# nvm をインストール(バージョン番号は公式ドキュメントで確認)
nvm install 22# Node 22 をインストール
nvm use 22# 現在ので Node 22 を使う
node -v# 切り替えたバージョンを確認

nvm は Node をの中にインストールするので、にも は要りません。バージョン番号(22)を書いた .nvmrc ファイルがあれば、そのプロジェクトで nvm use と打つだけで、誰でも正しいバージョンになります。nvm alias default 22 は新しいが使うバージョンを決め、nvm はインストール済みのバージョンを表示します。Windows では、別プロジェクトの nvm-windows が同じ役目をします。

npm scriptsとローカルバイナリ

の は、_modules/.bin を に加えた状態で実行されます。だから、プロジェクトの道具をにインストールしなくても使えます。

npm init -y# package.json をすばやく作る
npm install lodash# 実行時の依存パッケージを追加
npm install -D typescript# 開発のときだけ使う依存パッケージ
npm run build# scripts.build を実行

スクリプトは互いを呼び出せます(別のスクリプトの中で run lint npm run test)。追加のは -- のあとに書きます: npm run test -- --watch。start と test は run なしで動く特別な名前です(npm start、npm test)。node_modules/.bin は npm run の間だけ PATH に入ります。そのため、プロジェクトにインストールしたツールは、名前を直接打つと ' not found' になっても、スクリプトの中では動きます。

npxで一度きり実行

はなしでのツールを実行します。プロジェクト内にあれば使い、必要なら取得します。最新版を指定するには例のように@latestを付けます。

npx create-next-app@latest my-app# プロジェクトのひな形を作る例
npx prettier --write .# ローカルの、またはダウンロードした prettier を実行
npx --yes cowsay hello# 確認なしで一度だけ実行

npx はまずプロジェクトの _modules/.bin でツールを探し、見つからないときだけにダウンロードします。@ とバージョンを付けると固定できます(npx prettier@3 --check .)。知らないパッケージを npx で実行すると、インターネット上のを自分のコンピューターで動かすことになります。名前を正確に確かめましょう。よく似た名前の偽のパッケージがあります。

チャレンジ

新しいフォルダー hello- を作り、 と、'Hello from npm' と表示するファイル hello.js、それを実行する hello という npm を用意してください。そのあとスクリプトを実行しましょう。

ヒント npm init -y で package.json ができ、npm pkg set を使えばエディターを開かずにスクリプトを追加できます。

解答例を見る
mkdir hello-npm && cd hello-npm
npm init -y
echo "console.log('Hello from npm')" > hello.js
npm pkg set scripts.hello="node hello.js"
npm run hello

npm init -y は既定値で package.json を書きます。 … > hello.js がを作ります。npm pkg set scripts.hello=… は package.json にスクリプトを追加します(ファイルを手で編集してもかまいません)。npm run hello は実行するを表示してから、Hello from npm と表示します。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

AIコーディングエージェント導入メモ

公式のインストールか、 のでインストールします。インストールしたらすぐ、バージョンを表示するで確かめましょう。

curl -fsSL https://claude.ai/install.sh | bash# Claude Code (Anthropic)
curl -fsSL https://chatgpt.com/codex/install.sh | sh# OpenAI Codex
npm install -g @xai-official/grok# Grok CLI(npm で入れる別の方法の例)
claude --version && codex --version# インストールの確認(例)

どのも、プロジェクトの中のファイルから指示を読みます(Claude Code は CLAUDE.md、Codex やほかの多くは AGENTS.md)。だからプロジェクトのルールを一度伝えればすみます。許可しない限り、コマンドを実行したりファイルを変えたりする前に確認してくるので、何を実行しようとしているのかを読みましょう。このコースのコマンドこそ、そこで目にするものです。こうしたツールはすぐに変わるので、バージョンを確かめてこまめにアップデートしましょう。

Firebaseとその他の必須CLI

・ログイン・に使う は、速いマネージャーの pnpm と一緒にインストールすることがよくあります。

npm install -g firebase-tools# Firebase CLI
firebase login# でログイン
firebase projects:list# プロジェクトの一覧
npm install -g pnpm# pnpm をにインストール

firebase init は質問をしながら firebase.json を書きます。firebase deploy はプロジェクトをアップロードし、firebase emulators:start はテスト用にサービスを自分のコンピューターで動かします。自動はブラウザーでログインできないので、代わりにに入れたサービスアカウントのキーを使います。pnpm は、各パッケージのコピー一つを複数のプロジェクトで共有して、ディスクの容量を節約します。

PATHと権限の問題

はが実行ファイルを探すフォルダの一覧です。インストール後もが見つからなければ、そのフォルダがPATHにあるか確認しましょう。whichで場所を調べ、を使う場合は今のシェルに読み込まれているかも確認します。

which node npm# がある場所
echo "$PATH"# 検索パスを確認
npm config get prefix# の行き先
command -v firebase || echo "not found"# インストールされているか確かめる

PATH は : で区切ったフォルダーの一覧で、左から順に探され、最初に見つかったものが使われます。そのため が二つインストールされていると、片方がもう片方を隠すことがあります。which -a node ですべてを表示できます。フォルダーを追加するには ~/.zshrc か ~/.bashrc に export PATH="$HOME/.local/bin:$PATH" と書き、新しいを開きます。 install -g で出る EACCES エラーは、npm がシステムのフォルダーに書き込もうとしているという意味です。nvm を使うか、npm の prefix をへ移せば直ります。

チャレンジ

・・ がインストールされているかを確かめる短いを書きましょう。見つかったものはそのバージョンを、見つからないものは 'missing: NAME' を表示します。

ヒント -v NAME は、NAME が にあるときだけ成功します。出力は に送りましょう。大事なのはだけです。

解答例を見る
for tool in node npm git; do
  if command -v "$tool" >/dev/null; then
    echo "$tool $("$tool" --version)"
  else
    echo "missing: $tool"
  fi
done

ループはツール名ごとに一回回ります。二つの部分のどちらを実行するかは command -v が決めます。$("$tool" --version) はツール自身を実行してバージョンを得ます。git は 'git version 2.x' と表示し、node は v22.11.0 のように先頭に v の付いた番号を、npm は番号だけを表示します。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

言語別の一行実行オプション

ほとんどの言語には、「をで受け取って、すぐに実行する」があります。違うのはオプションの文字だけで、使い方は同じです。

python3 -c "import sys; print(sys.version)"# の一行実行
node -e "console.log(1 + 1)"# の一行実行
perl -e 'print "hello\n"'# Perl の一行実行
ruby -e 'puts (1..5).to_a'# Ruby の一行実行
php -r 'echo PHP_VERSION;'# PHP は -r を使う

AIがファイルを修正するときのパターン

にの修正を頼むと、答えはほとんどこの形になります。ファイルを読み、を置き換えて書き戻す小さな を、で渡す形です。大事なのは、置き換えるが本当にあるかを、先に assert で確かめることです。

python3 - <<'PY'# ここから PY までが Python のプログラム
p = "src/app.py"# 修正するファイルの
s = open(p, encoding="utf-8").read()# ファイル全体を読む
old = "before text"# 探す文字列(この行がないと NameError になる)
new = "after text"# 入れる文字列
assert old in s# 対象がなければここで止まる(いちばん大事な行)
s = s.replace(old, new)# 置き換える
open(p, "w", encoding="utf-8").write(s)# 書き戻す
PY# ヒアドキュメントの終わり — 行のいちばん先頭に正確に

ヒアドキュメント応用 — 設定ファイルを作る

は、の中で複数行の設定や文書を作るときにも、いちばんすっきりした方法です。タグをで囲まないと、$ がその場で値に置き換わります。

cat <<EOF > .env# タグを囲まない → 変数が値に置き換わる
PORT=$PORT# $PORT が実際の値になって保存される
EOF# ここで終わり
cat <<'EOF' > template.txt# 囲む → $PORT が文字のまま残る
bash <<< "echo one-liner"# で一行だけ渡す

sed応用 — 狙った行だけ直す

前にアドレス(行番号や)を付けると、その行だけが変わります。-i でファイルを直接書き換えるときは、-i.bak のようにを付けましょう — バックアップが残り、macOS でも でも同じように動きます。

sed -n '10,20p' log.txt# 10〜20 行目だけ表示
sed '/^#/d' config.txt# # で始まる行を消す
sed -i.bak 's/3000/8080/' config.txt# バックアップ(.bak)を残してファイルを書き換える
sed -E 's/([a-z]+)@([a-z.]+)/\2 \/ \1/' mail.txt# を使って順番を入れ替える
sed 's/error/ERROR/gI' log.txt# せずに、すべて置き換える
printf 'appended\n' >> notes.txt# 最後の行の後ろに追加(どこでも使える方法)

awk応用 — 集計と書式

の本当の力は、による集計と の書式に表れます。表を読み、項目ごとにまとめて、見やすく表示するまでが一行で済みます。

awk '{sum[$1] += $2} END {for (k in sum) printf "%-10s %5d\n", k, sum[k]}' sales.txt# 項目ごとの合計を表にして表示
awk -F, '{print $2}' data.csv# なら -F, でカンマで分ける
awk 'NF > 0' notes.txt# 空行を消す(パターンだけを書くと、その行を表示する)
awk '{n = split($0, a, "/"); print a[n]}' paths.txt# からファイル名だけ
awk 'NR == FNR {m[$1] = $2; next} $1 in m {print $1, m[$1], $2}' a.txt b.txt# 二つのファイルを結合する
awk 'BEGIN {printf "%.2f\n", 22 / 7}'# BEGIN だけで電卓になる

jq・xargs — 言語をつなぐ接着剤

は で、「見つけた結果ごとにを実行する」は で扱います。両方を知っていると、でつなげられる範囲がぐっと広がります。

curl -s https://api.example.com/u | jq '.name'# JSON からを一つ
jq -r '.items[] | .id' data.json# を一行に一つずつ(-r でを外す)
ls *.txt | xargs wc -l# 見つけたファイルごとにコマンドを実行
grep -rlZ TODO . | xargs -0 sed -i.bak 's/TODO/DONE/g'# + でまとめて修正(-Z と -0 で空白を含むファイル名も安全に、バックアップも残る)

チャレンジ

1から100までの合計を二回表示してください。一回はで渡した短い で、もう一回は と で。

ヒント - はからプログラムを読みます。awk は足し合わせ、END で合計を表示できます。

解答例を見る
python3 - <<'PY'
print(sum(range(1, 101)))
PY
seq 1 100 | awk '{s+=$1} END {print s}'

python3 - は <<'PY' と PY のあいだのを実行します。PY を囲むのおかげで、は中身を何も変えません。seq 1 100 は一行に一つずつ数を書き、awk がそれぞれを s に足して、最後に一度だけ表示します。どちらも 5050 を表示します。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

貪欲マッチと最短マッチ

*と+はできるだけ多く取ります()。後ろに?を付けて*?や+?にすると、できるだけ少なく取ります(最短マッチ) — これはの文法( -P、)でだけ使えます。とでは、[^"]*のように「その文字以外」で範囲を絞りましょう。

echo '<b>a</b><b>b</b>' | grep -Po '<b>.*</b>'# 貪欲: 最初の<b>から最後の</b>までがひとかたまり
echo '<b>a</b><b>b</b>' | grep -Po '<b>.*?</b>'# 最短: <b>a</b>と<b>b</b>を別々に
grep -Eo '"[^"]*"' data.json# 拡張文法: 「以外」で範囲を絞る
grep -Po 'id=\K\d+' app.log# \K — 前の部分はチェックだけして、数字だけを表示
python3 -c "import re; print(re.findall(r'\d+(?=ms)', 'took 2300ms'))"# 先読み(?=…) — msの直前の数字だけ

後方参照 — 同じテキストをもう一度

捕まえたをパターンの中で\1として呼び出すと、「同じテキストがもう一度出てくる」ところを探せます。うっかり2回打った単語を探したり直したりするのに使います。

grep -Ew '([a-z]+) \1' notes.txt# 同じ単語が2回続くところを探す(the the)
sed -E 's/\b([a-z]+) \1\b/\1/g' notes.txt# 2回続いた単語を1つにする
grep -E '^(.)(.).?\2\1$' words.txt# 逆から読んでも同じ4〜5文字の単語(level、noon)
sed -E 's/(.*)=(.*)/\2=\1/' config.txt# key=valueの左右を入れ替える

同じ作業をOSごとに

同じ作業をOSごとにどう行うか並べて比べてみましょう。とmacOSはと、Windowsはのと-replaceを使います。

grep -rn -E 'TODO|FIXME' .# LinuxとmacOS: フォルダー内のすべてのファイルを検索
Select-String -Path *.txt -Pattern 'TODO|FIXME'# Windows PowerShell: 同じ作業
sed -i.bak -E 's/[[:space:]]+$//' notes.txt# LinuxでもmacOSでも: 行末の空白を消す(.bakのバックアップを残す)
(Get-Content notes.txt) -replace '\s+$', '' | Set-Content notes.txt# Windows PowerShell: 同じ作業
findstr /R /C:"^[0-9][0-9]*$" numbers.txt# Windows: 数字だけの行(+がないので[0-9][0-9]*)

rg・perl・git — より速く、より強力なツール

(rg)はより速く、\dをそのまま理解し、に書かれたファイルを自動で飛ばします(brew install ripgrep、apt install ripgrep)。macOSとに入っているはの元祖で、はのと履歴をで検索します。

rg -n 'TODO|FIXME'# 今のフォルダー以下をすべて、行番号付きで
rg -o '\d{4}-\d{2}-\d{2}' -g '*.log'# .logファイルの日付だけ
perl -pe 's/(\d+)-(\d+)/$2-$1/g' a.txt# Perl: 12-34 → 34-12
perl -pi -e 's/foo/bar/g' *.txt# Perl: 複数のファイルをその場で書き換える
git log --grep='fix.*login' -i --oneline# メッセージを正規表現で検索
git log -G 'apiKey' --oneline# コードの変更を正規表現で検索

Pythonのreをもっと

のreはの文法を使うので、\d \w \s、最短マッチ、名前付きがすべて使えます。パターンはrawr"…"で書きましょう — ふつうの"\b"はバックスペース文字になってしまいます。

import re# モジュールを読み込む
re.search(r"\d+", "a12b").group()# 最初の一致 → "12"
re.findall(r"\d+", "a12b345")# すべての一致 → ["12", "345"]
re.sub(r"\s+", " ", "a b")# 置き換え → "a b"
re.split(r"[,;]\s*", "a, b;c")# 正規表現で分割 → ["a", "b", "c"]
m = re.match(r"(?P<y>\d{4})-(?P<m>\d{2})", "2026-10")# 名前付きグループ — m["y"]は"2026"
pat = re.compile(r"error", re.I)# 一度だけ作っておく。re.Iは大文字・小文字を区別しない

awkと正規表現

はを使います。/パターン/は行全体を、$3 ~ /パターン/はそのをチェックし、gsubで置き換えます。-Fにを渡すと、複数ので一度に分けられます。

awk '/ERROR|WARN/' app.log# -Eと同じ
awk '$4 ~ /^user=a/' app.log# 4列目がuser=aで始まる行
awk '$3 !~ /INFO/ {print $3, $4}' app.log# INFOではない行の3列目と4列目
awk '{gsub(/[0-9]+ms/, "N ms"); print}' app.log# 行の中の2300msのような値をすべて置き換える
awk -F'[=: ]+' '{print $2}' config.txt# =、:、続いた空白をすべて区切り文字として扱う

チャレンジ

contacts.txt の行の中に、メールアドレスが混ざっています。すべてのアドレスを一回ずつ、並べ替えて、アドレスだけを表示してください。

ヒント -o は一致した部分だけを表示し、-E は + や {2,} を使えるようにし、 -u は重複を取り除きます。

解答例を見る
grep -oE '[[:alnum:]._%+-]+@[[:alnum:].-]+\.[[:alpha:]]{2,}' contacts.txt | sort -u

パターンは、英字・数字・._%+-(名前の部分)、@、、ドット、二文字以上の英字の順です。-o は、一行に複数あっても、一致したものを一つずつ別の行に表示します。本物のメールアドレスの規則はもっと複雑ですが、ログから探すにはこのパターンで十分です。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

オプションを置ける場所と --

はふつうのすぐ後ろに来ますが、 の道具()はの後ろでも受け取り、BSD の道具(macOS)は受け取りません。だからコマンド・オプション・対象の順がどこでも通じる習慣です。-- の後に来るものはすべて対象としてのみ読まれ、横棒で始まる名前を救います。

ls -l notes.txt# どこでも通じる順序
ls notes.txt -l# Linux では動き、macOS では動かない
rm -- -weird.txt# 横棒で始まる名前のファイルを削除する
grep -- -v notes.txt# オプションではなく「-v」という文字を探す

man・--help の角かっこの読み方

man や --help の最初の行が、そののパターンそのもので、書き方はどれも同じです。角かっこ [ ] は省いてよいもの、... はその枠を何度も書いてよいこと、縦棒 | はどちらかを選ぶことで、大文字や斜体の単語が自分で埋める枠です。この1行を読めば、使ったことのないコマンドも呼べます。

ls --help | head -5# 最初の数行にパターンがある
man ls# マニュアル全体 — q で出る
man -k copy# することからコマンドを探す
type cd# この名前はか組み込みか別名か

終了コード 0 と $?

すべてのはを残して終わります — 0 は成功、それ以外の値は失敗です。$? には直前のコマンドのが入っていて、 が見ているのはまさにこの値です。多くのコマンドに「静かに」があり、出力なしでコードだけを使えます。

ls notes.txt; echo $?# 成功すると 0 が出る
ls missing.txt; echo $?# 失敗すると 0 以外の値が出る
grep -q echo todo.sh && echo found# -q は何も表示せずコードだけ残す
true; echo $?# true はいつも成功、false はいつも失敗

チャレンジ

du はまだ習っていないです。--help でパターンを調べ、ダウンロードフォルダーで場所を一番使っている5つを、大きいものが後に来るように出してみましょう。

ヒント --help の最初の行がパターンです。-s はごとに合計ひとつ、-h は人が読む単位、 -h はその単位を理解して並べます。

解答例を見る
du --help | head -20
du -sh ~/Downloads
du -sh ~/Downloads/* | sort -h | tail -5

du --help を見ると、パターンが du []... [FILE]... だと分かります — どちらの枠も省けて、何度も書けるという意味です。だから -sh をオプションの枠に、~/Downloads/* を対象の枠に入れ、その結果を sort -h へ渡して -5 で最後の5行だけ見ます。du を覚えたことはなく、パターンだけで書いたのです。

答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。

ディスクをもっと詳しく見る: fdisk -l・blkid・parted print

は木の形を描き、さらに3つのがその中をのぞきます。fdisk -l はテーブルをセクター単位で表示します。blkid はの種類と UUID を見せます。UUID は変わらない通し番号で、ディスクを足すと変わることがある sda1 という名前とは違います。 print は parted 自身の言葉でテーブルを見せます。どれも読むだけです。

sudo fdisk -l /dev/sda# パーティションテーブルをセクターごとに
sudo blkid# 各パーティションのファイルシステムの種類と UUID
sudo parted -s /dev/sda print# 同じテーブルを parted から見たもの
cat /proc/partitions# カーネル自身が知っていること

ファイルの中のディスク: ループデバイス

練習のために予備のディスクはいりません。デバイスを使うと、ふつうのファイルをディスクのように扱えます。好きな大きさのファイルを作り、フォーマットして、-o loop でマウントします。仮想マシンのディスクイメージやUSBインストーラーも、まさにこのしくみで動いています。

truncate -s 16M usb.img# 空の16MBのファイル
mkfs.vfat usb.img# USBーのようにフォーマット
sudo mkdir -p /mnt/usb && sudo mount -o loop usb.img /mnt/usb# ファイルをディスクのようにマウント
df -h /mnt/usb# 本当はファイルである16MBの「ディスク」

ディスクを自分のものにして、起動時にマウントする

フォーマットしたばかりのディスクは root のものです。chown でマウントポイントを自分のものにすれば、 なしで書けます。また、マウントはコンピューターを再起動するまでしか続きません。本物のでは /etc/fstab に1行足して、起動するたびにマウントされるようにします。名前ではなく blkid の UUID を使うのがおすすめです。再起動の前に -a でその行を試しましょう。fstab が壊れていると、サーバーが起動しなくなることがあります。

sudo chown you /mnt/data# マウントポイントが自分のものになる
echo "mine" > /mnt/data/mine.txt# もう sudo はいらない
echo "/dev/sda1 /mnt/data ext4 defaults 0 2" | sudo tee -a /etc/fstab# 起動するたびにマウント(本物のサーバーでは UUID=… を使う)
sudo umount /mnt/data && sudo mount -a && df -h /mnt/data# fstab の行が動くか確かめる

パッケージマネージャーを並べて比べる

どのマネージャーも、探す・インストールする・一覧を見る・削除する、という同じいくつかのことを、少しずつ違う言葉でしています。 と apt はシステム全体にインストールするので が必要です。 と は やプロジェクトフォルダーにインストールするので sudo はいりません。pip freeze と package.json は、どこでも同じ環境を作り直せるレシピです。

apk search htop# 名前でパッケージを探す
sudo apk del figlet# をまた削除する
pip freeze > requirements.txt# この venv の パッケージを書き出す
npm ls# この Node プロジェクトが使っているパッケージ

curl をもっと詳しく — POST・ヘッダー・待ち時間・再試行

ここまでは取ってくる(GET)だけでした。 に何かを送るときは、-X POST でやり方を変え、-d のあとに送る中身を書き、-H でヘッダー(中身の種類やアクセス)を付けます。-v はやり取りされるリクエストとレスポンスをすべて見せてくれるので、うまくいかない理由を探すときに使います。が遅かったり一瞬切れたりするときに備えて、--max-time で待つ時間を決め、--retry でもう一度試します。では -f を付けて、失敗がでわかるようにしましょう。トークンのような秘密はに直接書かず、に入れておきましょう。

curl -X POST -H "Content-Type: application/json" -d '{"name":"you"}' https://httpbin.org/post# を送る — 相手は受け取ったものをそのまま答えてくれます
curl -v -o /dev/null https://sonub.com/robots.txt# リクエストとレスポンスのヘッダーをすべて見る(> は送ったもの、< は返ってきたもの)
curl -fsS --max-time 10 --retry 3 -o /dev/null https://sonub.com/up && echo OK# 10秒以内に、最大3回まで再試行 — サーバー確認スクリプトの基本
curl -H "Authorization: Bearer $TOKEN" https://api.github.com/user# アクセストークンは環境変数に入れておく(ないと 401 が返ります)

チャレンジ

練習用ディスク sda を半分ずつ2つに分けましょう。前半を ext4、後半を FAT(vfat)でフォーマットし、/mnt/data と /mnt/share にマウントして、 -h で2つを比べます。

ヒント のひとつで、gpt テーブルと2つのを作れます。1MiB から 50% と、50% から 100% です。そのあと と mkfs.vfat、マウントポイント2つ、 2回です。

解答例を見る
sudo parted -s /dev/sda mklabel gpt mkpart data ext4 1MiB 50% mkpart share fat32 50% 100%
lsblk /dev/sda
sudo mkfs.ext4 /dev/sda1
sudo mkfs.vfat /dev/sda2
sudo mkdir -p /mnt/data /mnt/share
sudo mount /dev/sda1 /mnt/data
sudo mount /dev/sda2 /mnt/share
df -h /mnt/data /mnt/share

gpt は新しい形のパーティションテーブルで、gpt テーブルでは mkpart の最初に名前(data、share)を書きます。2つのパーティションは sda1 と sda2 になり、それぞれ自分のを持ちます。df -h は両方を大きさといっしょに表示します。FAT は自分用に取っておく場所が少ないので、空き容量が ext4 と少し違って見えます。

これは自分のパソコンではなく、練習用ターミナルでやりましょう。ディスクを消して作り直します。先に「セッションをリセット」を押して、ディスクを空にしておきましょう。

Learn X in Y Minutes(Bash、CC BY-SA)を参考に再構成しました。一部は参照専用です。

レッスン完了!すばらしい!また一歩成長しました。