AIの回答を自分で実行
ファイル整理や自動化をに頼むと、ので答えが返ってくることがよくあります。シェルを読めれば、実行前に安全性を自分で確認できます。
に頼めば、本当に何でもやってくれます。しかし何も分からないまますべてを任せてしまうと、AIに縛られ、AIがしたことをまるで自分でやったかのように錯覚してしまいます。
大切な仕事を任せた上司が、その内容をまったく知らないと考えてみてください。部下がうまく進めても結果を判断しにくく、退職すれば引き継ぎにも困ります。AIに任せるときも、基礎知識が必要なのは同じです。
AIも同じです。基本を知っている人だけが、AIのした仕事を理解し、正しいか確かめ、行き詰まったときに自分で続けられます。AIを使いこなす人になるには、基本を知る必要があります。
は、その基本中の基本であり出発点です。シェルコマンドを学ぶとOSの扱い方と管理の基礎が身につき、その次のステップがまさにサーバーを自分で運用することです。
怖がらなくて大丈夫です。分からないコマンドはAIに聞きながら簡単に学べます。一行ずつ自分で打ちながら、一歩ずつ学んでいきましょう。
のではを思い浮かべがちですが、AIツールのインストールや実行を支える実用的な基礎は、のとです。
シェルはAIを作るための主な言語ではありませんが、Pythonより前からファイル管理や作業の自動化に使われてきた道具です。
深く学び込む必要はありません。よく使うコマンドをいくつか覚えるだけで、気軽に始められ、一生役立つ基礎になります。
はの実行、ファイル管理、開発の自動化にとても役立ちます。でもはブラウザ・アプリ・ノートブック・でも使えるので、すべてのAI利用者が端末を使わなければならないわけではありません。
基本から ・開発ツール、 や ・ など他の言語の実行、まで、学んだらすぐに実行しましょう。
を開き、ファイルを扱い、テキストを探して数え、をつなぎます。この4つのレッスンを終えるだけで、ターミナルを一人で使えるようになります。
値を入れ()、判断して(条件・繰り返し)、のまとまりに名前を付けて()、自分だけの自動化を安全に作ります。
と開発ツールをインストールし、から・・・を使って実際の作業をします。
すべてのが共通で守る形を集めました — 枠・・・つなぐ記号。初めて見るコマンドも読めるようになります。このレッスンは先に読んでもかまいません。
練習用は本物のコンピューターです。空のディスクを自分で準備し、インターネットからダウンロードしてインストールしましょう。本物ので使う手順とまったく同じです。
ファイル整理や自動化をに頼むと、ので答えが返ってくることがよくあります。シェルを読めれば、実行前に安全性を自分で確認できます。
シェルは何十年も基本の文法がほとんど変わっておらず、macOS・・のどこにでもある共通語です。一度学べばmacOS・Linux・サーバー・・AIツールで長く活用できます。
macOSの標準シェルはですが、基本コマンドやは多くの場合そのまま使えます。ただし、のないの分割や番号はbashと異なります。はbashを基準に学びましょう。先頭のは、直接実行するときにbashを使う指定です。macOS付属のbash 3.2には -Aなどがないため、それらの例はこのコースので試してください。
20行ほどので、に実際にページを返すWebを起動できます。が結局「テキストのかたまりをやり取りする約束」であることがよく分かる例です。
#!/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
mkfifo "$PIPE"
を作ります。が受け取ったリクエストと、作った応答がこの通り道を行き来します。
nc -l "$PORT"
nc(netcat)で8084番を開き、ブラウザーの接続を待ちます。サーバーを一つで代用します。
response()
リクエストの1行目(メソッド・)を読んでログを残し、index.htmlをHTTP 200応答にして返します。
while true; do … done
応答後に接続が切れるとが回り、次の訪問者を受け付けます。おかげでサーバーは動き続けます。
同じフォルダーにindex.htmlを置き、bash server.shで実行してから、ブラウザーで:8084を開いてください。本番用ではありませんが、仕組みの理解に最適です。
入力の基本、、を確認する方法を学びます。
かんたんに言うと コンピューターと文字で交わす最初の会話で、一行打つと一行の答えが返ってきます。
ファイルやフォルダーを作り、コピー・移動・削除・表示する方法を実践します。
かんたんに言うと ファイル管理画面でマウスを使ってしていた作成・コピー・移動・削除を、文字を打って行います。
必要な行を探し、並べ替え・重複削除・件数集計を行い、フォルダーの中にあるファイルそのものも探します。
かんたんに言うと とても長い文章に使う、蛍光ペン・並べ替え・数え上げの道具です。
|で出力を次の入力へ渡し、>と>>で結果をファイルへ送ります。
かんたんに言うと ベルトコンベヤーのように、の結果を次のコマンドへ渡し、最後に箱(ファイル)に詰めます。
値をに保存し、結果や計算結果を文章に組み込むを学びます。
かんたんに言うと 名札を付けた箱のようなもので、値を入れておき、あとで名前を呼んで取り出します。
ifで動作を選び、forやwhileで同じ作業をます。
かんたんに言うと 「雨なら傘を持つ」「階段を十段上る」のように、判断と繰り返しをさせます。
よく使う処理をにまとめ、・・を理解します。
かんたんに言うと よくする作業を書いたレシピカードのようなもので、名前を呼ぶだけで作業がまるごと終わります。
これまでの要素を組み合わせ、安全に実作業を自動化するを学びます。
かんたんに言うと ドミノのように、前の作業が成功したときだけ次の作業が進みます。
やの事故を防ぎ、エラーが起きたら安全に止まる守りのの書き方を身につけます。
かんたんに言うと シートベルトのように、と安全が事故を前もって防ぎます。
からを使う方法を学びます。バージョン確認、実行、での管理、の一度きり実行まで。
かんたんに言うと のアプリストアのようなもので、npm が道具を取ってきて、 が のを動かします。
とをに入れる短い案内です。Node/が揃えば、多くは一行から始められます。
かんたんに言うと 新しい作業場に道具を運び込み、一つずつ使えるか確かめるようなものです。
はすべてを自分でこなすのではなく、他の言語を呼び出す指揮者です。一行で渡す-c、複数行をまとめて渡す、そしてが最もよく使うとを学びます。
かんたんに言うと 通訳のように、シェルが ・awk・sed に仕事を頼み、結果を受け取ってきます。
(regex)は、探したいテキストの「形」を書き表すための小さな言語です。日付・メールアドレス・は値こそ違っても形は同じです。で探し、で書き換え、やでチェックしましょう。macOS・・Windowsに最初から入っているも学びます。
かんたんに言うと 「数字3つ-数字4つ」のような形のはんこで、形の合う文字をすべて見つけるようなものです。
のはいくつかの形しか守りません。コマンド・・という枠を身につければ、ひとつずつ覚える代わりに、初めて見るコマンドも読んで書けます。
かんたんに言うと 枠に名前が書かれた書類のようなものです。枠が分かれば、どんな書類でも埋められます。
練習用は、空のディスクとつながったインターネットを持つ本物のです。ディスクをに分け、フォーマットし、フォルダーにつないでファイルを保存しましょう。そのあと でWebページを取ってきて、 clone でプロジェクトをコピーし、・・ でをインストールします。本物のとまったく同じやり方です。
かんたんに言うと 新品のパソコンを準備するのと同じです。空のドライブを整えてから、アプリをダウンロードしてインストールします。
コマンド [] の基本形を使う
現在地を確認してフォルダー間を移動する
で文字を表示する
manと--helpで調べる
管理者権限が必要なコマンドには を付ける
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
コマンド
後ろに何もいらないもあります — 名前ひとつでコマンド全部です。
コマンド オプション 対象
ほとんどのが守る形です — 何を、どうやって、何に対して。
cd どこへ
は移動先ひとつだけを受け取ります。空にするとへ行きます。
echo 文字
は渡した文をそのまま表示します。空白があればで囲みましょう。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
は文字でを入力する窓です。その内容を読み取って実行するがで、このコースではを使います。$や%などのは入力待ちの印です。その後ろにコマンドを入力し、Enterを押しましょう。この操作方法を(コマンドラインインターフェース)と呼びます。
もっと詳しく プロンプトには $ 以外の情報もよく表示されます。多くのコンピューターでは you@laptop:~$ のように見え、ユーザー名・コンピューター名・今いるフォルダー(~ は)・$ の順に並んでいます。コマンドの実行中はプロンプトが消え、終わるとまた現れます。つまりプロンプトが見えないあいだは、シェルがまだ働いているということです。コマンドが止まったように見えたら、Ctrl+C で止めてプロンプトを取り戻しましょう。
多くのは「動作・・」で構成されます。 -l notes.txtなら、notes.txtファイルを詳しく一覧表示するという意味です。知らないコマンドは、manの後ろにその名前を書くか、コマンドの後ろに--helpを付けると説明書が見られます(でも本物のマニュアルが開き、q で閉じます)。
もっと詳しく オプションはふつうダッシュ(-)で始まります。ダッシュ一つには一文字の短いオプションが続き、まとめて書けるので ls -l -a と ls -la は同じです。ダッシュ二つには ls --all のような読みやすい長い名前が続きます。引数はコマンドが扱う対象で、たいていはファイル名やフォルダー名です。ls notes.txt photos のように、一度にいくつも受け取るコマンドもたくさんあります。名前に空白が含まれるときはで囲むと、一つの引数のままになります。
で、で移動、で内容を確認します。~は、..はです。
もっと詳しく はファイルの住所です。絶対パスはディスクのいちばん上の / から始まります(たとえば /home/you/notes.txt)。そのため、どこからでも通じます。相対パスは今いる場所から始まります(photos/cat.jpg)。そのため、正しいフォルダーにいるときだけ通じます。cd だけを打つとすぐホームフォルダーへ戻り、cd - は直前にいたフォルダーへ戻ります。名前を打っている途中で Tab を押すと、が残りを補ってくれます()。打ち間違いが減ります。
このページでは、何もインストールせずにですぐ練習できます。Macではアプリを開きます(Spotlightで「ターミナル」と検索)。Windowsではスタートメニューからを開きます。このコースと同じを使うには、をインストールしてUbuntuを開きます。たいていのデスクトップではCtrl+Alt+Tを押します。
もっと詳しく Mac の標準は zsh で、このコースのコマンドをほとんどすべて理解します。こことまったく同じシェルを使いたければ bash と打ちましょう。PowerShell では ・・ などいくつかの名前は使えますが動きが違い、存在しないコマンドも多いため、Windows では WSL をおすすめします。どこでも矢印キーで前に打ったコマンドを呼び出せます。もう一度打たずに ↑ を押して、直前のコマンドをもう一度実行したり書き直したりしましょう。
コンピューター全体を変える作業 — の導入や /etc のようなシステムフォルダへの書き込み — は管理者(root)の仕事なので、そのまま実行すると と返ってきます。の前に を付ければ、同じコマンドがその権限で動きます(sudo add tree など)。はワードを聞きませんが、自分のパソコンではログインパスワードを入力します。本当に必要なときだけ使いましょう。
もっと詳しく sudoは通常、1つのコマンドを管理者権限で実行します。のインストール(apk add・apt install)、/etc・/usrの変更、ディスクの接続などに使います。ミスを防ぐ機能ではないため、先にコマンドとを確認しましょう。内の権限エラーは所有者と権限を確認します。 install -gもインストール先によってはsudoが不要です。
実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。
ls -la ~/projects
ls: フォルダーの中身を一覧表示します。-l詳細形式(long): 一行に一つずつ、権限・持ち主・サイズ・日付と一緒に表示します。-aすべて(all): 名前がドットで始まる( など)も表示します。~/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課ですが、ここから先のすべての課に出てきます — 「そしてそれをそのまま渡す」と読んでください。
ls|wc -l
がファイルを並べ、 -l がその行数を数えるので、出てくるのは「ファイルが何個か」です。
cat notes.txt|head -3
がファイル全体を出し、 -3 がそのうち先頭の3行だけを残します。
echo "hello shell"|wc -c
が送るを -cが数で数えます。末尾の改行も含み、ファイルには保存しません。
フォルダーと空ファイルを作る
コピー・移動・名前変更・削除を行う
・・で内容を見る
削除を安全に使う
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
mkdir オプション 対象
フォルダーを作ります。-p を付けると途中のも一緒に作ります。
cp オプション 対象 どこへ
コピーは枠が2つです — 何をコピーし、どこへ置くか。フォルダーごとなら -r が必要です。
mv 対象 どこへ
移動と名前の変更は同じ形です — 新しいフォルダーなら移動、新しい名前なら改名です。
rm オプション 対象
指定したものを削除します。ごみ箱がないので -i で先に確認させましょう。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
はフォルダー、は空ファイルを作ります。mkdir -pならもまとめて作れます。多くのと同じく、成功しても何も表示しないので、で結果を確かめましょう。
もっと詳しく touch にはもう一つの役目があります。ファイルがすでにあれば中身はそのままにして「最後に変更した時刻」だけを更新するので、二回実行しても安全です。一方 mkdir は、フォルダーがすでにあると 'File exists' と文句を言います。ただし -p を付ければ、あるフォルダーは黙って受け入れます。空白を含む名前にはが必要なので(mkdir "my notes")、空白の代わりに - や _ を使ってこの手間を避ける人がたくさんいます。
は元のファイルを残してコピーを作ります。はファイルを移動したり名前を変えたりします。どちらも元のファイル、移動先の順に書きます。例えばmv memo.txt diary.txtは、同じフォルダ内でmemo.txtをdiary.txtに改名します。
もっと詳しく 最後のが既存のフォルダーなら、cp と mv はファイルを同じ名前のままその中へ入れます。cp a.txt b.txt backup/ は二つのファイルを backup にコピーします。フォルダーを丸ごとコピーするには -r()が必要で、付けないと cp は断ります。mv はなしでフォルダーを移動できます。mv での名前変更は巨大なファイルでも一瞬です。名前が変わるだけで、何もコピーしないからです。
は全体、とは先頭や末尾だけを表示します。はゴミ箱を使わず即座に削除するため注意が必要です。
もっと詳しく head と tail は、指定しなければ10行を表示します。head -n 3 なら三行です。tail -f はファイルを見張り続け、追加された行を次々に表示するので、を動かしながらログを見るときに使います(Ctrl+C で止めます)。長いファイルには less を使いましょう。一画面ずつ表示し、Space で次のページ、/ で検索、q で終わります。rm はゴミ箱を通らないので、同じ名前やパターンでまず してから rm する習慣をつけると安心です。
実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。
cp -r photos backup/photos-2026
cp: コピーします。-r: フォルダーとその中身をすべてコピーします。-r がないと、 はフォルダーのコピーを断ります。photosコピー元: コピーするフォルダーです。backup/photos-2026コピー先: backup の中に photos-2026 という名前でコピーができます。backup フォルダーは先に存在している必要があります。何も表示されません。このようなコマンドは、成功すると何も出力しません。
コピーがうまくいくと、cp は何も表示しません。 backup で確かめると photos-2026 があるはずです。backup がなければ 'No such file or directory' と出るので、 -p backup で先に作ってから、もう一度コピーしてください。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
ls -l|head -3
詳しい一覧は画面からはみ出すほど長いので、 -3 で先頭の3行だけ見ます。
mkdir -p backup&&cp notes.txt backup/&&ls backup
前がうまくいったときだけ次へ進みます — は「それができたときだけ」で、最後が結果を見せてくれます。
ls photos|wc -l
photos フォルダを開かずに、中がいくつあるかを数えます。
で行を探す
grep -iと-nを使う
で並べ替える
で数える
find で名前と種類からファイルやフォルダーを探す
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
grep オプション 探す文字 どこで
探す文字が先、どこを探すかが後です。この順序は変わりません。
sort オプション ファイル
ファイルの行を並べ替えます。-r は逆順、-n は数として並べます。
wc オプション ファイル
ファイルの内容を数えます。-lは行、-wは単語、-cは数です。バイト数と文字数は異なることがあります。
find どこで 条件 動作
find は文のように読めます — どこを探し、何に一致し、見つけたものをどうするか。
試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
word fileは一致する行だけを表示します。-iはを無視、-nは行番号、-rは検索です。
もっと詳しく grep はファイルを一行ずつ読み、パターンがどこかに含まれている行をすべて表示します。 を探すと 'concatenate' も見つかるのはそのためです。単語全体が一致する行だけにするには -w を付けます。パターンに空白や記号があるときはで囲みます(grep "error " app.log)。-r とフォルダーを渡すと、grep は見つけた行の前にファイル名を付けるので、どこで見つかったかが分かります。
は行を順番に並べます。は隣り合う同じ行を1つにするため、離れた重複は先にsortで集めます。 -lは行数を数えます。次の単元ではでこれらをつなぎ、簡単な集計をします。
もっと詳しく sort は文字として比べるので、そのままでは 10 が 9 より前に来ます。数値には sort -n、逆順には sort -r を使います。uniq は隣り合った同じ行しかまとめないので、ほとんどいつも sort のあとに置きます。wc をなしで使うと、行数・単語数・数の三つの数をこの順に表示します。-l・-w・-c で一つだけ選べます。
がファイルの中の行を探すのに対し、find はファイルやフォルダーそのものを探します。出発点のフォルダーとその下のすべてのフォルダーをたどり、条件に合うもののを一行に一つずつ表示します。基本の形は find 場所 条件 動作 です。
条件なしで 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/
grep: パターンを含む行を探します。-r: フォルダーとそのすべてのサブフォルダーにあるファイルを探します。-iを無視: TODO・Todo・todo がすべて一致します。-n行番号: 一致した行の番号も表示します。"todo"探すパターンです。一語ならはなくてもかまいませんが、付ける習慣をつけておくとよいでしょう。src/探す場所: src フォルダーです。src/app.js:12: // TODO: check the password length src/utils/date.js:3:// todo: handle time zones
見つかったものは「ファイル名 : 行番号 : その行の内容」の形で表示されます。そのファイルのその行を開いて対処しましょう。一致する行がないと は何も表示しませんが、エラーではありません。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
grep "echo" todo.sh|wc -l
が合う行を見つけ、 -l がその行を数えるので、何回出てくるかが分かります。
sort notes.txt|head -3
先に行を並べ替えてから先頭の3行だけ残します — アルファベット順で最初の3つです。
find . -name "*.txt"|wc -l
find は見つけるたびにを1行ずつ出すので、行を数えればファイルの数になります。
|でコマンドをつなぐ
>で保存する
>>でする
の流れを理解する
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
コマンド | コマンド
左のの出力が右のコマンドの入力になります。間にファイルはありません。
コマンド > ファイル
出力を画面ではなくファイルへ送ります。元の中身は消えます。
コマンド >> ファイル
同じことですが、消さずに末尾へ書き足します。
コマンド < ファイル
ファイルをの入力として渡します — 矢印が文の流れる向きを指します。
コマンド 2> ファイル
2 はを指すので、エラーを結果から切り分けられます。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
A | コマンドBは、Aの出力をBの入力に渡します。 | txtではlsが一覧を作り、grep txtがtxtを含む行だけを表示します。まず左側だけを実行して結果を見てから、|と次のコマンドを付けましょう。
もっと詳しく どのコマンドにも(読む場所)と標準出力(書く場所 — ふつうは画面)があります。は左のコマンドの出力を右のコマンドの入力につなぎ、二つは同時に動くので、データはできたそばから流れていきます。パイプラインは一歩ずつ組み立てましょう。最初のコマンドを実行して出力を見てから、| と次のコマンドを付け足します。
>は、>>は、<はファイルを入力にします。2>はエラーだけを保存します。
もっと詳しく はが始まる前にリダイレクトを準備します。だから data.txt > data.txt はファイルを壊してしまいます。> がまず data.txt を空にし、そのあと sort が空のファイルを読むからです。新しいファイルに書きましょう(sort data.txt > sorted.txt)。数字はの名前です。0 は入力、1 はふつうの出力、2 はエラーなので、2> はエラーだけを、>(1> と同じ)はふつうの出力だけをファイルへ送ります。
は入力をファイルに保存しながら、画面や次のにも送ります。T字の管のように流れが2つに分かれます。 | tee list.txtなら一覧を見ながら保存できます。既存の内容にするにはtee -aを使います。
もっと詳しく tee は、管理者権限が必要なファイルに書くときにもよく使われます。 "text" | tee /etc/somefile はうまくいきます。しかし、sudo echo "text" > /etc/somefile は失敗します。リダイレクト(>)をするのは sudo ではなく、自分のだからです。画面にコピーを出さずファイルだけが欲しいときは、最後に > を付けます。
実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。
ls ~/Downloads | grep pdf | wc -l
ls ~/DownloadsDownloads フォルダーの一覧です。出力がへ行くとき、 は一行に一つずつ名前を書きます。|パイプ: その一覧を画面に出さず、次のへ送ります。grep pdfpdf を含む行だけを残します。|二つ目のパイプ: 残った行をさらに渡します。wc -l届いた行の数を数えます。7
画面に書くのは最後のコマンドだけで、ほかのコマンドは出力を渡すだけです。表示される一つの数は、名前に pdf を含むファイルの数です。名前そのものを見たいときは、最後の部分(| -l)を外してもう一度実行しましょう。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
ls|sort -r|head -3
を三つ続けて — 並べて、順序をひっくり返して、先頭の3つだけ残す。どれも自分の小さな仕事だけをします。
cat notes.txt|wc -l>count.txt&&cat count.txt
> が数をファイルに置き、 がそのファイルを出して本当に入ったかを見せます。
ls|grep txt|wc -l
先に絞ってから数える — 「そういうのは何個?」に答える定番のやり方です。
変数を作って値を取り出す
変数を安全にする
$(( ))で計算する
$( )でコマンド結果を得る
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
名前=値
自分で名前を付けた箱に値を入れます。= の両側に空白は入れません。
"$名前"
$ で値を取り出し、二重を残して空白を守ります。
$(コマンド)
を実行し、その出力を値として使います。
$((値))
かっこが二重なら計算です — が計算してくれます。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
name=valueで作り、$nameで取り出します。=の左右に空白を入れてはいけません。
もっと詳しく 名には英字・数字・_ だけが使え(日本語の文字は使えません)、数字で始めることはできません。習慣として、自分の変数は小文字、ほかのと共有する設定(・HOME)は大文字で書きます。変数は作ったの中でしか生きていないので、新しいを開くと消えています。どのセッションでも使いたいなら、その行を ~/.bashrc(Mac では ~/.zshrc)に書いておきましょう。
"$name"のように囲むと、値の空白が保たれます。安全なの基本習慣です。
もっと詳しく の中でも $ は働くので "$name" は値になりますが、空白は守られ、* がファイル名に変わることも防がれます。のすぐ後ろに文字が続くときは、ブレースで名前の終わりを示しましょう。"${name}s" は値の後ろに s を付けて表示しますが、"$names" は names という変数を探してしまいます。シングルクォートは変数を完全に止めます('$name' は $name のまま表示されます)。
$(( ))は計算結果を入れます。$(( 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"
today=today というを作ります。= の前後に空白を入れてはいけません。$(date +%F)date を実行して、その答えをここに入れます。+%F は 2026-10-17 の形の日付を求める指定です。;最初のの終わり。続けて同じ行で次のコマンドを実行します。cp notes.txtnotes.txt をコピーします …"notes-$today.txt"… この新しい名前へ。$today は日付に置き換わり、が全体を一つの名前にまとめます。何も表示されません。このようなコマンドは、成功すると何も出力しません。
コピーがうまくいくと何も表示されません。 を実行すると notes-2026-10-17.txt が見えます。明日同じ行を実行すれば明日の日付の新しいファイルができるので、簡単な毎日のバックアップになります。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
count=$(ls|wc -l)&&echo "files: $count"
$( ) がつないだの出力を受け取るので、つなぎ全体が値一つになります。
echo "$HOME"|wc -c
に入っている値も、ほかの出力とまったく同じように渡せます。
first=$(head -1 notes.txt)&&echo "$first"
ファイルの最初の行を自分で付けた名前に入れて、それを出します。
if / elif / elseでする
[[ ]]で比較する
forで一覧を処理する
数値との比較を区別する
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
if [[ 条件 ]]; then 動作; fi
if で開き、fi で閉じます。条件が動作を実行するかどうかを決めます。
for 名前 in リスト; do 動作; done
リストの項目がひとつずつ名前の枠に入り、そのたびに動作が実行されます。
while [[ 条件 ]]; do 動作; done
条件が真のあいだ繰り返すので、中で何かがその条件を変える必要があります。
case 値 in 探す文字) 動作;; esac
ひとつの値をいくつもの形と照らし合わせます。枝ごとに ;; で終え、esac で全部を閉じます。
試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
ifは条件を調べ、真ならthenの後のを実行します。別の条件はelif、どれにも当てはまらない場合はelseに書き、最後にfiで閉じます。if 条件; then ... fiを「この条件なら、この処理」と読んでみましょう。
もっと詳しく if のあとの条件は、実はコマンドです。if はそれを実行してを確かめ、0 なら真とみなします。だから if -q milk notes.txt; then … はかっこなしでも動きます。then と fi のあいだの行は字下げして、各ブロックの終わりが見えるようにしましょう。全部を一行で書くときは、then の前の ; を忘れずに。
は==と!=、数値は-eq(等しい)・-gt(より大きい)・-lt(より小さい)・-ge(以上)・-le(以下)、ファイルとフォルダーは-fや-dで確認します。
もっと詳しく の中では、(かつ)と ||(または)で検査をつなげ、! は否定を表します: [[ -f notes.txt && ! -d backup ]]。迷ったら、比較するはで囲みましょう。古い一重の [ ] では必須です。空の変数がに穴をあけてしまうからです。数だけを扱うなら (( )) のほうが自然に読めます: if (( score >= 80 )); then …
for item in list; do ... doneは一覧を一つずつに入れてます。
もっと詳しく in のあとのリストはループが始まる前にされるので、for f in *.txt はテキストファイルごとに一回ずつ回り、$f にその名前が入ります。一致するファイルがないと、パターンそのものが一回だけ使われます($f が *.txt になります)。[[ -e $f ]] で確かめるか、 をオンにしましょう(レッスン9)。$() をループで回すのはやめましょう。名前に空白があるときは、パターンのほうが安全です。
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
for f in *.txtこのフォルダーの .txt ファイルごとに一回ずつます。毎回、f にファイル名が一つ入ります。do繰り返すの始まりです。echo "$f: …"ファイル名と、そのあとに行数を表示します。$(wc -l < "$f")そのファイルの行数を数えます。< でファイルを入力として渡すので、 は数字だけを表示します。doneループの終わり。次のファイルへ進みます。notes.txt: 3 lines todo.txt: 12 lines
ファイルごとに一行ずつ表示されます。ループは .txt ファイルの数だけ回ります。一つもなければ *.txt という文字のまま一回回り、wc がエラーを出します。レッスン9の でこれを防げます。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
for f in *.txt; do wc -l "$f"; done|sort -n
が出したものは一つの流れになって出てくるので、 -n 一つで全部が並びます。
ls|grep -q txt&&echo "txt here"
-q は何も出さず成功か失敗かだけを伝えますが、 が見ているのはまさにそれです。
if ls|grep -q todo; then echo "found"; fi
つないだは if の条件にもなります — 渡すのは文字ではなく成功か失敗です。
関数を定義して呼び出す
$1などの引数を使う
#!/bin/bashを説明する
を理解する
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
名前() { 動作; }
のまとまりに名前を付けます。波かっこが中身を包み、$1 は受け取った最初の値です。
名前 値
自分で作ったも他のと同じように呼びます — 名前が先、値が後です。
bash ファイル
を に渡します。がないファイルでもこれで動きます。
chmod +x ファイル
+x はこのファイルを実行できると印を付けます。一度やれば済みます。
./ファイル
./ は「すぐここにあるファイル」という意味です。はを探さないからです。
試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
name() { ; }で処理に名前を付け、$1や$2でを受け取ります。
もっと詳しく は定義してから呼び出します。中の$1・$2はその関数に渡された引数です。文字の結果はなどで出力し、result=$(myfunc)で受け取れます。returnは文字を返しません。return 0は成功、return 1など0以外は失敗を知らせます(範囲0〜255)。
複数のをhello.shなどのファイルに保存したものがです。先頭のはシバンと呼ばれ、./hello.shのように直接実行するときにを指定します。今のがzshでもbashで動きます。bash hello.shと実行を直接指定することもできます。
もっと詳しく シバンは必ずいちばん最初の行に置き、正確に #! で始めなければなりません。多くのスクリプトは代わりに #!/usr/bin/env bash を使います。env が bash をインストールされた場所から探してくれるので、bash が /bin にないシステムでも動きます。.sh という末尾は人のための目印にすぎず、どのプログラムがファイルを実行するかを決めるのは名前ではなくシバンです。
+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
backup()backup というを定義します。{ … ; }関数の本体です。{ のあとの空白と } の前の ; は必須です。cp "$1" "$1.bak"最初のを、名前の後ろに .bak を付けてコピーします。&& echo …メッセージを表示します。コピーが成功したときだけです。backup notes.txt関数を呼び出します。関数の中では $1 が notes.txt になります。saved notes.txt.bak
1行目は関数を定義するだけで、何も表示しません。2行目が関数を実行してメッセージを表示します。別のファイル名で呼び出せば、同じ手順がそのファイルに対して動きます。それこそが関数を使う意味です。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
bash hello.sh|wc -c
が出したものも、ほかのの出力とまったく同じように次へ渡せます。
chmod +x hello.sh&&./hello.sh
動かせるように印を付けて動かすまでを1行で — 後ろは前がうまくいったときだけ起きます。
bash todo.sh|head -1
が出したもののうち、最初の1行だけ見ます。
で成功・失敗を確認する
で処理をつなぐ
forで複数ファイルを処理する
の予約実行を理解する
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
コマンド && コマンド
前のが成功したときだけ、後のコマンドを実行します。
コマンド || コマンド
前のが失敗したときだけ、後のコマンドを実行します — 非常口です。
コマンド >> ファイル 2>&1
結果とを1つの記録ファイルにまとめます。
時刻 コマンド
の形です — 時刻の5つの枠の後に。自分のパソコンで動き、このでは動きません。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
は成功なら0、失敗なら別の値を返します。で直前の結果を読み、A BはA成功時だけBを実行します。
もっと詳しく 0 以外の終了コードの意味は、ごとに自分で決めています。たとえば は、一致するものがなければ 1、何かがおかしければ 2 を返します。A || B は && の逆で、A が失敗したときだけ B を実行します。 backup || "could not create" のように使います。成功したは exit 0、失敗したスクリプトは exit 1(または別の数)で終わらせましょう。そうすれば、実行した側(人、、別のスクリプト)が結果を確かめられます。
とファイル操作を組み合わせれば、多くのへ同じ処理を自動実行できます。
もっと詳しく ファイルを変える前に、の前にを付けて実行内容を確認しましょう。これをと呼びます。バックアップ名に$(date +%F)を入れると日別になりますが、同じ日の再実行では名前が重なります。実行ごとに残すなら時刻も入れましょう。段階ごとの表示で進み具合が分かります。
は決まった時刻にを実行する予約ツールです。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
*/15分: 15分ごと(0・15・30・45分)。9-18時: 9時から18時まで。* *日と月: いつでも。1-5曜日: 月曜日(1)から金曜日(5)まで。/home/you/check.sh実行するをフルで。 はスクリプトのあるフォルダーではなく、から始まります。>> /home/you/check.log出力をログファイルの末尾にします。2>&1エラーも同じログに送り、あとで読めるようにします。何も表示されません。このようなコマンドは、成功すると何も出力しません。
この行はで打つものではありません。crontab -e で保存すると、cron が自動で実行します。平日の 9:00 から 18:45 まで、15分ごとです。には何も表示されないので、check.log を開いて何が起きたかを確かめ、crontab -l で行が保存されたかを確認しましょう。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
mkdir -p logs&&ls>logs/list.txt&&cat logs/list.txt
三つの手順を、前が成功したときだけ次へ — が事故を起こさないための書き方です。
bash todo.sh>out.txt2>&1&&cat out.txt
2>&1 がを結果と同じファイルへ送るので、記録一つに全部が残ります。
cat missing.txt||echo "no such file"
は && の反対側です — 前が失敗したからこそ、この文が出てきます。
3種類の引用を説明する
単語分割とグロビングを理解する
set -euo pipefailを使う
を必ず引用する
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
コマンド "対象"
空白が入った名前は、の中でだけ1つになります。引用符がないと2つに見えます。
"$名前"
二重の中でも $ は値を取り出しますが、値をひとまとまりに保ちます。
'文字'
一重は「この文字そのまま」という意味です — $ も力を失います。
コマンド -- 対象
-- の後に来るものはとして読まれません。- で始まる名前を救います。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
によってののされ方が変わります。
迷ったら二重引用符で囲むのが基本です。
もっと詳しく 簡単に試すと違いが見えます。name="a b" のとき、 $name は a b を表示します(空白が詰められます)が、echo "$name" は a b を表示します。テキストの中にシングルクォートを入れるには、ダブルクォートで囲みます("it's")。ダブルクォートの中で特別な意味を持つのは $・`・"・\ のいくつかの文字だけで、前にバックスラッシュを付ければ守れます。
はのないをまず空白などで分割し、次に*・?を一致するファイル名にします。前者が、後者がです。fileがmy notes.txtなら、 $file backup/は2つのファイルとして読みます。cp "$file" backup/なら1つの名前で渡せます。
もっと詳しく 分割には IFS の文字が使われます。標準では空白・タブ・改行です。そのあとグロビングが *、?、[abc] を一致するファイル名に置き換えるので、* を入れた変数が突然フォルダー内のすべてのファイル名に変わることがあります。どちらも引用符で囲まれていない展開にしか起きず、ダブルクォートの中では決して起きません。
set -euo pipefailはのミスを早く見つける助けになります。各の役割を確認しましょう。
すべてのミスを防げるわけではありません。と実行結果の確認も行いましょう。
もっと詳しく set -euo pipefail はのすぐ次の行に置き、スクリプト全体に効くようにしましょう。shellcheck はマネージャーでインストールします(brew install shellcheck、 apt install shellcheck)。多くのエディターの中で動き、打つそばから間違いに下線を引いてくれます。警告には SC2086(の付け忘れ)のような番号があり、番号ごとに直し方を説明したページがあります。
実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。
cp -- "$src" "$dest/"
cp: コピーします。--の終わり: -- のあとはすべて名前です。- で始まっていても同じです。"$src"で囲んだコピー元: 空白を含む名前も一つののままです。"$dest/"引用符で囲んだコピー先のフォルダー。最後の / で、フォルダーでなければならないことをはっきりさせます。何も表示されません。このようなコマンドは、成功すると何も出力しません。
コピーがうまくいくと何も表示されません。引用符がなければ、'my report.txt' のような名前は二つの引数に分かれてしまいます。-- がなければ、- で始まる名前(-r など)がオプションとして読まれます。二つの安全策があれば、中に何が入っていても、それぞれの値がちょうど一つの名前として届きます。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
ls *.txt|wc -l
が先に星を埋めてくれるので、 -l が数えているのは本物のファイル名です。
wc -l "report 2024.txt"|head -1
が、空白の入った名前を一つのファイルとして守ります。なければ二つに見えます。
grep 'e' "report 2024.txt"|wc -l
探す文字は、空白の入った名前はダブルクォートで囲んでから数えます。
node -vでNode.jsのバージョンを確認する
node app.jsでJavaScriptファイルを実行する
npmでパッケージを入れスクリプトを実行する
npxで導入なしに一度だけ実行する
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
node ファイル
のファイルを Node に渡すと、そのまま実行します。
コマンド オプション
--version はほとんどの道具で通じるので、インストールを確かめる一番早い方法です。
npm 動作
は2番目の枠にサブを受け取ります — run・install・init のように。
npm 動作 オプション 対象
installの後に名を書きます。インターネットにつながったで実行できます。
試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
はブラウザの外(・)でを動かす()です。Webページを作るツール、ターミナルで使うツール、、多くのがNode上で動きます。の次に覚えると開発ツール導入が楽になります。
もっと詳しく Node.js は Chrome と同じ JavaScript エンジン(V8)を使います。ただし、Web ページを表示する代わりに、ファイルを読み書きしたり、ネットワークにつないだり、ほかのプログラムを実行したりします。偶数番号のバージョン(22・24 など)は、何年も修正が届く LTS(長期保守)版になるので、学ぶときには安全な選択です。nodejs.org からインストールするか、 を使います(発展テーマを参照)。
-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)。
は再利用できるの集まり、を管理します。package.jsonには名前・版、必要なパッケージ(dependencies)、実行する()があります。そのフォルダでnpm installするとパッケージを取得し、npm run startでstartを実行します。ならにインストールせずにパッケージのコマンドを実行できます。
もっと詳しく npm install は二つのものを作ります。_modules はダウンロードしたコードです。とても大きくなることが多く、編集ももしません。 は、インストールした正確なバージョンの一覧です。全員が同じものを使えるように、これはコミットします。npm ci はロックファイルに書かれたとおりに入れるので、自動ではこれを使います。^4.17.21 のようなバージョンは「このバージョンか、互換性のあるもっと新しいバージョン」という意味です。
実際によく使われるコマンドを一つ、部品に分けてみました。部品ごとの役目を読んでから、画面に何が出るかを確かめましょう。
npm install --save-dev prettier
npm に付いてくるマネージャーです。installパッケージをダウンロードして、プロジェクトに追加します。--save-devdevDependencies に記録します。開発中には必要でも、アプリの実行時には要らないものです。短く書くと -D です。prettierパッケージ名。ここではをきれいに整える道具 Prettier です。added 1 package, and audited 2 packages in 2s found 0 vulnerabilities
は追加したパッケージの数を知らせ(一つのパッケージがほかのパッケージを連れてくることもあります)、簡単なセキュリティ検査(audit)を行います。これで package.json の devDependencies に prettier が載り、 prettier --write . でプロジェクトに使えます。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
node app.js|wc -l
Node が出したものもただの文字なので、はほかと同じように数えられます。
cat package.json|grep name
ファイルを読んで、自分が見たい行だけを残します。
node --version&&npm --version
確認を二つ1行で。前の道具が本当にあるときだけ後ろが動きます。
多くのツール導入の前提がだと説明する
Claude Code・Codex・Grok・の代表的な導入コマンドを知る
導入(-g)と一度きり実行()を区別する
導入後にバージョン確認する習慣を持つ
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
コマンド オプション
道具にバージョンを尋ねて、本当に入っているか確かめます。
command -v コマンド
そのがあればを表示し、なければ何も表示しません。
コマンド 動作 オプション 対象
インストールの行はたいていこの形です — 道具、サブ、、。自分のパソコンで使いましょう。
curl オプション 値 -o ファイル
から取得し、-oの後のファイルに保存します。でもインターネット接続があれば実行できます。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
現代の開発はエディタだけでは終わりません。次のようなツールがで動きます。
レッスン10で学んだ Node・ がその出発点です。
もっと詳しく こうしたツールの多くはアカウントが必要です。で一度ログインすれば( login など)、ツールが覚えていてくれます。どれも にあるふつうのなので、このコースで扱ったこと(、、)はすべてそのまま使えます。AI コーディングエージェントはを代わりに実行してくれるので、コマンドが何をするのかを理解することは、重要でなくなるどころか、もっと重要になります。
公式手順は変わるので、常に公式ドキュメントを優先してください。一般的な出発点は次のとおりです。
導入後は claude --version、codex --version、firebase --version のようにバージョンを確認します。
もっと詳しく インストール直後にが見つからなければ、新しいを開きましょう。更新されたが反映される場合があります。手動で設定を読み直すなら、zshは~/.zshrc、bashは~/.bashrcなど、今のに合うファイルを使います。更新はインストール時の方法で行います。npmの例はnpm install -g firebase-tools@latest、削除はnpm uninstall -gの後に名です。
| は信頼できる公式からだけ。で権限エラーならよりを直します。チーム・ではで版を固定すると安全です。
もっと詳しく インストーラーはダウンロードして、実行する前に中身を読みましょう。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
curlWeb のアドレスからダウンロードします。-fsSL四つの短いをまとめたもの。のエラーで失敗する、静かにする、それでもエラーは表示する、転送先をたどる、の四つです。https://claude.ai/install.shインストーラーの公式アドレスです。-o install.shすぐに実行せず、ファイルに保存します。何も表示されません。このようなコマンドは、成功すると何も出力しません。
ダウンロードがうまくいくと何も表示されません。less install.sh で読んでから、 install.sh で実行しましょう。-o install.sh の代わりに | bash を使うと、は中身を見ることもないまま、すぐに実行されてしまいます。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
cat tools.md|grep -i git|head -3
読んで、 の話がある行だけ残し(-i はを区別しません)、そのうち3行だけ見ます。
which bash&&bash --version|head -1
まずがあるかを探し、それからバージョンを尋ねます。
ls|sort|head -2
いちばん素朴なつなぎです — 並べて、並べ替えて、切る。
-cや -eで他の言語を一行実行できる
をファイルに保存してpython3 ファイル.pyで実行できる
ヒアドキュメント(<<PY)で複数行のプログラムをに渡せる
sedでファイルのテキストを一括修正できる
awkで表形式データから取り出し集計できる
AIが書いたを実行する前に安全に確認できる
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
awk '{動作}' ファイル
は行ごとに書いた動作を実行します。$1 は最初の列です。
awk '条件 {動作}' ファイル
波かっこの前に条件を置くと、一致する行だけが動作を受けます。
sed 's/探す文字/値/' ファイル
s は置き換えです — これを探して、あれにする。斜線は枠を区切る線として読みましょう。
python3 ファイル
.py ファイルを に渡すと、そのまま動きます。
python3 -c '動作'
-c はファイルなしに、その場で を1行実行します。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
だけですべて計算しようとするとすぐ壁にぶつかります。シェルは「誰をいつ呼ぶか」を決める指揮者です。計算やデータは、表の集計は、テキストの一括修正はに任せ、シェルはその結果をつなぎます。シェルが分かれば、学んだことのない言語も呼び出して使えます。
多くの言語は「をで受け取ってすぐ実行する」を持っています。は -c "コード"、は -e "コード"、Perlは -e、Rubyはruby -eです。電卓の代わりにpython3 -c "print(2**10)"と打つ習慣だけで、は格段に強力になります。
一度きりでないはファイルに保存します。hello.py にを書いておけば、 hello.py でそのまま実行できます。
レッスン7で学んだを使うと、もっと簡単です。
実行後に と打てば、成功(0)か失敗(1)かが分かります。だからレッスン8のとおり、 で次のにつなげられます。
複数行のをまとめて渡すにはを使います。 - <<'PY'の次の行からコードを書き、最後の行にPYだけを書きます。の間の内容がPythonに渡ります。-はファイルではなくからコードを読む指定です。コーディングもこの形で複数行を実行します。
をで囲むと(<<'PY')本文がそのまま渡ります。囲まないと(<<PY)本文の$や$()をが先に置き換えます。に$はあまり出ませんが、やに$があると静かに壊れるので、コードを渡すときは囲む形が基本です。
で文字を置き換える基本の形は s/探す/置き換える/ です。
ファイル自体を書き換えるときは sed -i.bak 's/探す/置き換える/' ファイル のように書きます。元のファイルを ファイル.bak として残すので安全です(macOSとの違いは下の「注意」を見てください)。
は表形式の文字を扱う小さな言語でありです。行を空白で分け、最初の欄を$1、次を$2と呼びます。NFは欄の数、NRは行番号です。awk 'パターン { 処理 }'で行と処理を指定します。パターンを省くと全行、処理を省くと一致行を表示します。BEGINは読み始める前、ENDは読み終えた後に1回動き、準備や合計に使えます。
から受け取り標準出力へ流す同士は、で自由につなげます。たとえば sales.txt | '{print $2}' | -n | -3 は、一行で次のことをします。
awk・ はこうしてパイプでつなぎ、 は -c やでを渡すのが基本です。これがは指揮者だという言葉の本当の意味です。
はたいていこのの形で答えます。貼り付ける前に三つだけ確認しましょう。①どのファイルを触るのかを目で読む。②rmや>でする箇所がないか見る。③大事なファイルなら 元 元.bakで先にバックアップを取る。を読めるということは、AIの答えを検証できるということです。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
awk '{print $1}' sales.txt|sort|uniq -c
が1を取り出し、 が同じ行をまとめ、 -c がまとまりごとに数えます。
python3 hello.py|wc -c
が出し、が数える — お互いのことを何も知らなくてかまいません。
sed 's/=/ /' config.txt|awk '{print $1}'
が = を空白に変えるので、 が名前を1として読めるようになります。
. * + ? [ ] ^ $ などの基本記号でテキストの形を表せる
grep -Eで一致する行を探し、-oで一致した部分だけを取り出せる
sed -Eとでテキストの順序を入れ替えたり直したりできる
との違い、そしてgrep -Eで\dが数字にならない理由を説明できる
シェルスクリプトの[[ 値 =~ パターン ]]とPythonのreモジュールで値をチェックできる
macOS・Linux・Windowsに標準で入っている正規表現コマンドを選んで使える
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
grep -E '探す文字' ファイル
-E はより広い形の文法を有効にします。そこでは | が「または」です。
grep -oE '探す文字' ファイル
-o は行全体ではなく、一致した部分だけを表示します。
sed -E 's/探す文字/値/g' ファイル
g は1行の中で一致したものを最初だけでなく全部置き換えます。
[[ 値 =~ 探す文字 ]]
=~ は の中で値と形を直接照らし合わせます。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
010-1234-5678を検索すると、その番号だけが見つかります。同じ3桁・4桁・4桁の形なら[0-9]{3}-[0-9]{4}-[0-9]{4}と書きます。[0-9]は数字1つ、{3}は3回のです。こうした検索規則がです。・・・vim・・・PHPでも基本記号は似ていますが、細かな文法は確認しましょう。
.は任意の1文字です(a.cはabcにもa1cにも一致)。[abc]は角かっこの中のどれか1文字、[^abc]はその中にない1文字、[a-z]や[0-9]は範囲内の1文字です。よく使う集まりには短い名前があります。\dは数字、\wは単語の文字(英字・数字・_)、\sは空白です。大文字(\D \W \S)はその逆を意味します。のツールでは[[:digit:]]や[[:space:]]のようなの名前も使えます。
*は直前の文字の0回以上、+は1回以上、?は0回か1回(colou?rはcolorにもcolourにも一致)、{n}はちょうどn回、{n,m}はn回からm回です。の記号は、すぐ前の1文字(または1つの角かっこ・)にだけかかります。また、繰り返しはできるだけ多く取ろうとします()。".*"は行の最初のから最後の引用符まで全部取ってしまうので、1組の引用符の中だけにしたいときは"[^"]*"と書きます。
^は行の先頭、$は行の末尾です。^errorはerrorで始まる行、done$はdoneで終わる行、^$は空行に一致します。\bは単語の境界なので、\bart\bはartを見つけますがpartyには一致しません。これらの記号は文字を消費せず、位置だけを示します。角かっこの先頭にある^([^0-9])は「〜以外」という意味で、まったく別物なので混同しないようにしましょう。
red|blueはredまたはblueです。( )は複数の文字をひとまとまりにします — (ab)+はab、abab、ababababに一致します。を使うと、見つけた部分を取り出すこともできます。では\1 \2、では${BASH_REMATCH[1]}、ではm.group(1)です。だから2026-10-15を15.10.2026に変えるのも1行で済みます。
. * + ? ( ) [ ] { } ^ $ | \ にはすべて特別な意味があります。その文字そのものを探したいときは、前に\を付けます。ドットは\.、アスタリスクは\*、開きかっこは\(です。192.168.0.1をそのまま書くと、それぞれの.が「任意の1文字」になるので192x168y0z1にも一致してしまいます。また、ではパターンを必ずで囲みましょう。そうしないと、に渡る前にシェルが* ? $ { }を独自に変えてしまいます。
とで出会うの文法は三つあります。
のツールでは[0-9]と書き、どうしても\dを使いたいときはgrep -P()を使います。・・PHP・ (rg)は最初から\dを理解します。
macOS と には ・・・find・ が最初から入っています。ただし OS ごとに少しずつ違います。
下の「OS別の標準」の表に例をまとめました。
では [[ $value =~ パターン ]] で値をチェックします。
では import re をして、下のを使います。パターンは r"\d+" のように、前に r を付けた raw 文字列で書きます。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
grep -E "ERROR|WARN" app.log|wc -l
注意 — の中の | は にとって「または」で、外にある | がをつなぐ記号です。
grep -o "user=[a-z]*" app.log|sort|uniq -c
合った部分だけ取り出して並べ替え、それぞれ何回出てくるかを数えます。
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 |
とは何も指定しないとで読むので、+ ? | ( ) { }を機能として使うには前に\が必要です。-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を選びましょう。
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に移す場合も実際の結果を確認しましょう。
どんなコマンドも枠で読める — 何を、どうやって、何に対して
オプションの4つの形を見分けられる — -l・--all・-la・-n 5
対象の枠にを使い、シェルが先に埋めることを知る
初めて見るコマンドのパターンを --help と man で自分で調べられる
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
コマンド オプション 対象
ひとつだけ覚えるならこの形です — 何を、どうやって、何に対して。
コマンド --help
ほとんどのがここで自分のパターンを教えてくれます。初めて見るコマンドを身につける道です。
コマンド オプション 対象 どこへ
は元の、コピー先の順です。引数が2つのすべてのが同じとは限らないため、各位置の役割を確認しましょう。
コマンド 探す文字
の枠の * はが先に埋めます。だからは本当のファイル名しか見ません。
コマンド オプション | コマンド オプション
両側がそれぞれ自分の形を守り、は結果だけを渡します。
試してみよう 例を押すと、そのコマンドがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
私たちが打つほとんどの行は、・・の順です。 -la photos は「一覧を見る(ls)、詳しくまで(-la)、photos フォルダー」という意味です。コマンドはいつも先頭に来て、手を付けるものは最後に来ます。枠が見えてくれば長い行も怖くありません — ひと枠ずつ区切って読めばよいのです。
は動作方法を指定します。短いものはハイフン1つ(-l)、長いものは2つ(--all)で始まります。の-laは-l -aをまとめた形です。-n 5や--output report.txtのように値を受け取るものもあります。まず「・オプション・」の順で読み、必要な指定やまとめ方はヘルプで確認しましょう。
にはファイルやフォルダのを書きます。・は元の対象より後に移動先を書きます。ファイル名の*は0文字以上、?は1文字、[0-9]は数字1つに一致します。が先に一致する名前へして渡します。{a,b}は別の展開で、ファイルの有無に関係なくaとbの2つの名前を作ります。
は記号でつながります — | は結果を次のコマンドへ渡し、> はファイルに書き、>> はファイルの末尾に書き足し、 は成功した後だけ、|| は失敗した後だけ、; はそのまま次を実行します。包む印は4つだけです — "..." は文をひとまとまりに、$(...) はコマンドの結果を差し込み、$((...)) は計算し、[[...]] は条件を調べます。まとまりは開く語と閉じる語が対です — if は fi、for は done、{ は }。
を覚える必要はありません。名前の後ろに --help を付けるか、man と名前を打って最初の行を読めば、そこにパターンが書いてあります。その行で角かっこ [ ] は「省いてよい」、... は「いくつも書いてよい」という意味で、そのまま書かれた単語が自分で埋める枠です。またすべてのコマンドは成功を 0 で知らせ、 $? で見られます。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
ls *.txt|wc -l
の枠、そして、そして自分の枠を持つ別の — 両側が同じ骨組みです。
ls --help|head -5
は最初の行に自分のパターンを書いているので、そのヘルプを に流します。
cat notes.txt report.txt|wc -l
の枠に入れた二つのファイルが一つの流れになり、行数は二つ合わせて数えます。
でディスクとパーティションを見つけ、パーティション・・マウントポイントとは何かを説明する
空のディスクを でパーティションに分け、 でフォーマットし、 でつなぐ
-h で空き容量を確かめ、新しいディスクにファイルを書いて、安全に取り外す
curl と git clone でインターネットからダウンロードする
マネージャーでプログラムをインストールする — システムには apk、 には の中の pip、Node プロジェクトには npm
どのも決まった形を守ります。形を一度覚えれば、初めて見るコマンドも読めます。
lsblk 対象
を付けると、 はそのディスクとその中のだけを見せます。
sudo mkfs.ext4 対象
はディスク全体ではなくです。そして中身はすべて消えます。
sudo mount 対象 どこへ
先に何をつなぐか、次にどこへつなぐか。つまりデバイス、それからフォルダーです。
curl オプション 値
-s は を静かにさせ、-I はヘッダーだけを頼みます。値はWebアドレスです。
コマンド 動作 名前
マネージャーはみな同じ形です。マネージャー・すること・パッケージ — add、 install、 install。
試してみよう 例を押すと、そのがの入力欄に入ります。Enter を押すと実行されます。その前に書き換えてもかまいません。
はすべてのディスクを /dev の下のファイルとして扱います。(list block devices)はそれを木の形で描きます。
lsblk は見るだけで何も変えないので、いつも最初の一歩です。このレッスンを開くたび、または「セッションをリセット」を押すたびに、ディスクはまた空に戻ります。好きなだけ練習しましょう。
とは、ディスクの中で独立したドライブのように働く区画です。ディスクのいちばん最初にあるパーティションテーブルが、それぞれの区画がどこから始まりどこで終わるかを記録します。それを書くのが です。mklabel msdos は新しい空のテーブルを作り、mkpart primary ext4 1MiB 100% は 1MiB からディスクの終わりまでのパーティションをひとつ加えます。-s は「質問しない」という意味です。ディスクを変えるのは管理者の仕事なので、は で始めます。そのあと を見ると、sda の下に sda1 が出ます。
新しいはまだただの空き地で、ファイルを入れられません。フォーマットすると、そこにが書き込まれます。ファイルシステムとは、すべてのファイルの名前、データの置き場所、持ち主を覚えている目録です。 は でふつうに使う ext4 を作ります。mkfs.vfat は Windows や macOS でも読める FAT を作ります(USBーに向いています)。フォーマットすると、そのパーティションにあったものはすべて消えます。
はC:・D:の代わりにディスクをフォルダへ接続します。これがマウントで、接続先はマウントポイントです。 /dev/sda1 /mnt/dataの後、/mnt/dataのファイルはsda1に保存されます。 -hで容量を確認しましょう。新しいはroot所有なのでsudo で書くか、sudo chown you /mnt/dataで所有者を変えます。最後にsudo umount /mnt/dataで解除します。
( )は画面のないWebです。ブラウザーにアドレスを入れると、ブラウザーはにリクエスト( リクエスト)を送り、サーバーはレスポンスを返します。レスポンスには、(200 は OK、404 は見つからない、301 と 302 は別のアドレスに移った、500 はサーバーの失敗という意味です)、ヘッダー(中身の種類や大きさなどの情報)、そして本文(・・ファイル)が入っています。ブラウザーは本文をページとして描きますが、curl は届いたままをに見せるか、ファイルに保存します。だから curl は、サーバーが生きているかを確かめるとき、ファイルをダウンロードするとき、 を呼ぶときに使います。 よく使う:
インストールのでよく見る -fsSL は、この4つのオプションをまとめたものです。curl が受け取ったものは、でほかのコマンドに渡せます。| なら最初の数行だけ、| なら JSON のひとつの項目だけです。この は SONUB のネットワーク中継サーバーを通って本物のインターネットとやり取りします。エミュレーターなので、ダウンロードには数秒かかることがあります。
clone は、 のようなーからプロジェクトをコピーします。すべてのファイルと、その履歴もまるごとです。 はファイルをひとつ取ってきますが、git clone はフォルダー全体を取ってきます。--depth 1 を付けると最新の版だけを取るので、ずっと速くなります。できたフォルダーに で入り、 で見て回りましょう。この はエミュレーターなので、ダウンロードには数秒から数十秒かかります。
マネージャーは、文字を打って使うアプリストアです。を探し、それに必要なものといっしょにダウンロードして、インストールしてくれます。システムごとに自分のものがあります。
apk add figlet でプログラムをインストールし、apk search で探し、sudo apk del で削除します。
はPyPIからを入れます。まずvenvを作り、システムのPythonと分けましょう。 -m venv ~/venvで作り、source ~/venv/bin/activateで有効にします。(venv)が表示されたらpip installで中に入れ、終了時はdeactivateを使います。この実習では作成に約1分かかります。外にはpipがなく not foundになります。システム保護環境ではexternally-managed-environmentが出る場合もあります。
はプロジェクトごとにをインストールします。空のフォルダーで npm init -y を打つと、プロジェクトに必要なものの一覧である package.json ができます。npm install ms はパッケージを _modules にダウンロードし、package.json に書き込みます。だから後で誰でも、ただの npm install で同じ環境を作り直せます。プロジェクトごとに自分の node_modules を持つので、2つのプロジェクトがバージョンを取り合うことはありません。
を単独で使うことはほとんどありません。二つの間に記号を置くと、左が出したものがそのまま右に入っていきます。
lsblk|grep sda
がすべてのディスクとを見せ、 が練習用ディスク sda の行だけを残します。
sudo mkdir -p /mnt/data&&sudo mount /dev/sda1 /mnt/data
フォルダーが本当に作れたときだけディスクをつなぎます — は「それができたときだけ」という意味です。
curl -s https://sonub.com/robots.txt|head -3
がインターネットからファイルを取ってきて、 -3 がその最初の3行だけを見せます。
ユーザーに値をたずねて、に入れます。変数を前もって宣言しておく必要はありません。
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 -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 -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 は一致した行の後ろ・前の二行ずつも表示するので、ログの中でエラーの直前・直後に何が起きたかが分かります。
はファイルを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でさらに見ていきます。
は各行を空白(または -F で指定した文字)で分け、それぞれを列 $1、$2 … として扱います。合計・絞り込み・集計が得意です。
echo 'a b c' | awk '{print $2}'# 2 → bawk -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 -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 . -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 は、数行の小さなファイルを手早く作る方法です。
(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 ))"# べき乗 → 1024echo "scale=2; 10/3" | bc# 小数の計算 → 3.33$? はコマンドのたびに変わるので、あとで使うならすぐに保存しましょう(status=$?)。ほかにも便利なものがあります。$$ はのプロセス番号、$0 はの名前、$SECONDS はシェルが動いている時間、$LINENO は現在の行番号です。$RANDOM はゲームには十分ですが、暗証番号や秘密の鍵には向きません。秘密にする値には openssl rand のようなきちんとした生成ツールを使いましょう。
はシステムによって動きが少しずつ違います。 はどこでも同じように動き、桁数・そろえ方・小数点以下の桁を正確に決められます。
printf "こんにちは、%s!\n" "世界"# %s の場所に値が入る → こんにちは、世界!printf "%.2f\n" 3.14159# 小数第 2 位まで → 3.14printf "%05d\n" 42# 0 で埋めて 5 桁に → 00042printf は自分では改行しないので、書式の最後に \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 以降)。
答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。
一つの値をたくさんのパターンと比べるときは、if を何度も重ねるより case のほうがすっきりします(ほかの言語の switch に似ています)。
case "$x" in# x の値によってする 0) echo "ゼロ";;# 0 のとき 1) echo "いち";;# 1 のとき *) echo "それ以外";; esac# * はそれ以外のすべてに一致するパターンごとに yes|y|Y) のように | で選択肢を並べられ、ファイル名と同じも使えます。*.jpg|*.png) は画像ファイルの名前に一致します。最初に一致したパターンが選ばれて残りは飛ばされるので、何でも受け止める *) は最後に置きましょう。;; は各選択肢の終わりを示します。これを忘れるのが case でいちばん多い間違いです。
for は一覧や範囲を順にたどり、while は条件が真のあいだ、until は条件が偽のあいだます。C 言語風の for もあります。
for ((i=1; i<=3; i++)); do echo "$i"; done# C 言語風の forwhile (( 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"# いつも大文字 → HIlocal を付けないと、関数の中で設定した変数はすべて全体で共有され、ほかの場所にある同じ名前の変数をしてしまうことがあります。見つけにくいバグです。関数の中では local を基本にしましょう。readonly は決して変わってはいけない値を守り、変えようとするとエラーが表示されます。declare -p name は変数がどう定義されているかを表示するので、に役立ちます。
が -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 ./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 は、が(終了・エラー・中断)を受け取ったときに実行するを決めます。一時ファイルの後片付けに特に便利です。
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 のを置くと、エラーに強くなります。-e(エラーで止まる)・-u(未設定のを許さない)・-o pipefail(の失敗に気づく)を一緒に使います。-x は用です。
set -euo pipefail# 丈夫なスクリプトの定番の 1 行目set -x# 実行するを一つずつ表示(デバッグ)set +x# デバッグをやめるset -e には例外があります。if の条件の中、 や || のリストの中、結果を検査しているコマンドで失敗しても止まりません。すでにその失敗を扱っているからです。失敗しても害のないコマンドは || true で許可できます。set -x はデバッグしている部分の周りだけでオンにすると、トレースが短く済みます。
の後ろに & を付けると、で実行します。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 -euo pipefail は三つのを合わせたものです。それぞれがどんな事故を防ぐのかが分かると、なぜ定番になったのかが見えてきます。
set -e# どれか一つでもが失敗したら、すぐに止まるset -u# 定義していないを使うとエラー(打ち間違いを見つける)set -o pipefail# の途中の一段が失敗したら、パイプ全体を失敗にする-e だけでは、パイプの途中の失敗を見逃します。false | true は成功とみなされます。パイプはふつう最後のコマンドの結果しか報告しないからです。pipefail を付けると、どこか一部が失敗すればパイプ全体が失敗になります。-u は $flie のような打ち間違いを捕まえます。そうしないと黙って空になり、 -rf "$dir/$flie" が $dir の中身をすべて消す危険な行になってしまいます。
は、ファイル名の照合()のしかたを調整します。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= と 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 はフォルダーを決して消しません。
答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。
プロジェクトによって、必要な 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 が同じ役目をします。
の は、_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' になっても、スクリプトの中では動きます。
はなしでのツールを実行します。プロジェクト内にあれば使い、必要なら取得します。最新版を指定するには例のように@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 と表示します。
答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。
公式のインストールか、 のでインストールします。インストールしたらすぐ、バージョンを表示するで確かめましょう。
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)。だからプロジェクトのルールを一度伝えればすみます。許可しない限り、コマンドを実行したりファイルを変えたりする前に確認してくるので、何を実行しようとしているのかを読みましょう。このコースのコマンドこそ、そこで目にするものです。こうしたツールはすぐに変わるので、バージョンを確かめてこまめにアップデートしましょう。
・ログイン・に使う は、速いマネージャーの pnpm と一緒にインストールすることがよくあります。
npm install -g firebase-tools# Firebase CLIfirebase login# でログインfirebase projects:list# プロジェクトの一覧npm install -g pnpm# pnpm をにインストールfirebase init は質問をしながら firebase.json を書きます。firebase deploy はプロジェクトをアップロードし、firebase emulators:start はテスト用にサービスを自分のコンピューターで動かします。自動はブラウザーでログインできないので、代わりにに入れたサービスアカウントのキーを使います。pnpm は、各パッケージのコピー一つを複数のプロジェクトで共有して、ディスクの容量を節約します。
はが実行ファイルを探すフォルダの一覧です。インストール後もが見つからなければ、そのフォルダが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 を使うにの修正を頼むと、答えはほとんどこの形になります。ファイルを読み、を置き換えて書き戻す小さな を、で渡す形です。大事なのは、置き換えるが本当にあるかを、先に 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"# で一行だけ渡す前にアドレス(行番号や)を付けると、その行だけが変わります。-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 '{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 だけで電卓になるは で、「見つけた結果ごとにを実行する」は で扱います。両方を知っていると、でつなげられる範囲がぐっと広がります。
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ごとにどう行うか並べて比べてみましょう。と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)はより速く、\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-12perl -pi -e 's/foo/bar/g' *.txt# Perl: 複数のファイルをその場で書き換えるgit log --grep='fix.*login' -i --oneline# メッセージを正規表現で検索git log -G 'apiKey' --oneline# コードの変更を正規表現で検索の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は大文字・小文字を区別しないはを使います。/パターン/は行全体を、$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 の最初の行が、そののパターンそのもので、書き方はどれも同じです。角かっこ [ ] は省いてよいもの、... はその枠を何度も書いてよいこと、縦棒 | はどちらかを選ぶことで、大文字や斜体の単語が自分で埋める枠です。この1行を読めば、使ったことのないコマンドも呼べます。
ls --help | head -5# 最初の数行にパターンがあるman ls# マニュアル全体 — q で出るman -k copy# することからコマンドを探すtype cd# この名前はか組み込みか別名かすべてのはを残して終わります — 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 を覚えたことはなく、パターンだけで書いたのです。
答えを見る前に挑戦しましょう。例で使うファイルを確認し、必要なら練習用に作ってください。自分のパソコンでも練習用フォルダを使いましょう。
は木の形を描き、さらに3つのがその中をのぞきます。fdisk -l はテーブルをセクター単位で表示します。blkid はの種類と UUID を見せます。UUID は変わらない通し番号で、ディスクを足すと変わることがある sda1 という名前とは違います。 print は parted 自身の言葉でテーブルを見せます。どれも読むだけです。
sudo fdisk -l /dev/sda# パーティションテーブルをセクターごとにsudo blkid# 各パーティションのファイルシステムの種類と UUIDsudo 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 プロジェクトが使っているパッケージここまでは取ってくる(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)を参考に再構成しました。一部は参照専用です。