AIの回答を自分で実行
ファイル整理や自動化をに頼むと、多くの場合が返ってきます。を読めれば、実行前に安全性を自分で確認できます。
のではPythonを思い浮かべがちですが、AIツールのインストールや実行を支える実用的な基礎は、のとです。
シェルはAIを作るための主な言語ではありませんが、Pythonより前からファイル管理や作業の自動化に使われてきた道具です。
深く学び込む必要はありません。よく使うコマンドをいくつか覚えるだけで、気軽に始められ、一生役立つ基礎になります。
は実行・ファイル管理・開発の自動化に便利です。はブラウザ・アプリ・ノートブック・でも使えます。端末は便利な窓口の一つで、全利用者の必須条件ではありません。
基本から ・開発ツール、Python や ・ など他の言語の実行まで、学んだらすぐに実行しましょう。
ファイル整理や自動化をに頼むと、多くの場合が返ってきます。を読めれば、実行前に安全性を自分で確認できます。
シェルは何十年も使われてきた安定した共通語です。一度学べばmacOS・Linux・・・AIツールで長く活用できます。
macOSの標準シェルはですが、このコースのと概念はほぼ同じように動作します。を使えばBashで明示的に実行でき、の添字の開始番号のようなごく一部の高度な違いを除けばそのまま通用します。
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で実行してから、ブラウザーでlocalhost:8084を開いてください。本番用ではありませんが、仕組みの理解に最適です。
入力の基本、、を確認する方法を学びます。
ファイルやフォルダーを作り、コピー・移動・削除・表示する方法を実践します。
値をに保存し、結果や計算結果を文章に組み込む展開を学びます。
ifで動作を選び、forやwhileで同じ作業をます。
よく使う処理をにまとめ、・・を理解します。
必要な行を探し、並べ替え・重複削除・件数集計を行います。
|で出力を次の入力へ渡し、>と>>で結果をファイルへ送ります。
これまでの要素を組み合わせ、安全に実作業を自動化するを学びます。
やの事故を防ぎ、エラーに強いで仕上げます。
からを使う方法を学びます。バージョン確認、実行、での管理、の一度きり実行まで。
コーディングとデプロイをに入れる短い案内です。Node/が揃えば、多くは一行から始められます。
はすべてを自分でこなすのではなく、他の言語を呼び出す指揮者です。一行で渡す-c、複数行をまとめて渡す、そしてが最もよく使うとを学びます。
コマンド [] [対象] の基本形を使う
現在地を確認してフォルダー間を移動する
で文字を表示する
manと--helpで調べる
は文字でコンピューターに指示する画面です。$や%は入力待ちの印。を入力してEnterを押します。
多くのは「動作・・対象」で構成されます。 -l Documentsなら、Documentsを詳しく一覧表示するという意味です。
で、で移動、で内容を確認します。~は、..は一つ上のフォルダーです。
コマンドを選ぶとターミナルに入力されます。
フォルダーと空ファイルを作る
コピー・移動・名前変更・削除を行う
・・で内容を見る
削除を安全に使う
はフォルダー、は空ファイルを作ります。mkdir -pなら途中のフォルダーもまとめて作れます。
は原本を残してコピーし、は移動します。mv old newは名前変更にも使えます。
は全体、とは先頭や末尾だけを表示します。はゴミ箱を使わず即座に削除するため注意が必要です。
コマンドを選ぶとターミナルに入力されます。
変数を作って値を取り出す
変数を安全にする
$(( ))で計算する
$( )でコマンド結果を得る
name=valueで作り、$nameで取り出します。=の左右に空白を入れてはいけません。
"$name"のように囲むと、値の空白が保たれます。安全なの基本習慣です。
$(( 3 + 4 ))は7、$()はコマンドの結果を値として返します。
コマンドを選ぶとターミナルに入力されます。
if / elif / elseでする
[[ ]]で比較する
forで一覧を処理する
数値との比較を区別する
if ; then ... fiでは、条件が真のときだけ内側を実行します。elifやelseを追加でき、fiで閉じます。
は==と!=、数値は-gt/-lt/-eq、ファイルは-fや-dで確認します。
for item in list; do ... doneは一覧を一つずつに入れてます。
1から20までのように「決まった回数」を繰り返すには、で数字を作ってforに渡します。for i in $(seq 1 20); do ... done のように書き、$(seq 1 20) が 1 2 3 … 20 を作ります。inを抜いて for i $(seq 1 20) と書くとエラーになるので、「for in リスト」の順序を必ず守ってください。同じは for i in {1..20} のようにでも書けます。
コマンドを選ぶとターミナルに入力されます。
関数を定義して呼び出す
$1などの引数を使う
#!/bin/bashを説明する
を理解する
name() { ; }で処理に名前を付け、$1や$2でを受け取ります。
を.shファイルに保存できます。はで実行する指定です。
+x hello.shの後に./hello.shを実行します。$1、$2、$@、$#でを読みます。
コマンドを選ぶとターミナルに入力されます。
で行を探す
grep -iと-nを使う
で並べ替える
で数える
word fileは一致する行だけを表示します。-iはを無視、-nは行番号、-rは再帰検索です。
は検索・置換、は行を列に分けて表データを処理します。
で と打つツールは ripgrep です。この単元の と同じように行を検索しますが、既定でフォルダ全体を高速に探し、.gitignore に書かれたファイルは飛ばします。は grep とすべて同じではないので、まず grep を覚えてから併用するとよいです。ここのは rg に対応していないため、自分のパソコンで試してください。
は並べ替え、は連続する重複を統合し、 -lは行数を数えます。
コマンドを選ぶとターミナルに入力されます。
|でをつなぐ
>で保存する
>>で追記する
の流れを理解する
A | BはAの出力をBの入力へ直接渡します。小さな道具を組み合わせて強力な1行を作れます。
>は上書き、>>は追記、<はファイルを入力にします。2>はエラーだけを保存します。
の途中にを挟むと、流れる内容を画面(または次の)へそのまま渡しながら、同時にファイルにも保存します。名前はT字型の配管継手(tee)に由来します。>は出力をファイルへ「そらす」ため画面から消えますが、コマンド | tee ファイル は画面に見せつつ保存する点が違います。上書きせず追記するにはtee -aを使います。ログを残しながら結果も目で確認したいときに便利です。
コマンドを選ぶとターミナルに入力されます。
で成功・失敗を確認する
&&と||で処理をつなぐ
forで複数ファイルを処理する
の予約実行を理解する
は成功なら0、失敗なら別の値を返します。で直前の結果を読み、A && BはA成功時だけBを実行します。
とファイル操作を組み合わせれば、多くの対象へ同じ処理を自動実行できます。
は決まった時刻に実行します。0 3 * * *は毎日午前3時を意味します。
コマンドを選ぶとターミナルに入力されます。
3種類のを説明する
単語分割とグロビングを理解する
set -euo pipefailを使う
を必ず引用する
"$var"は展開しつつ空白を守り、'$var'は文字どおり、なしはや展開が起きます。
しない値は複数のに分かれ、*や?がファイル名に変わるため事故の原因になります。
set -euo pipefailはエラー・未定義・途中の失敗を検出します。も有効です。
コマンドを選ぶとターミナルに入力されます。
-vでNode.jsのバージョンを確認する
node app.jsでファイルを実行する
npmでパッケージを入れスクリプトを実行する
npxでグローバル導入なしに一度だけ実行する
はブラウザの外(・)でを動かすランタイムです。Webアプリ、、ビルド、多くのコーディングがNode上で動きます。の次に覚えると開発ツール導入が楽になります。
-v(または--version)で版を確認します。node app.jsはファイル実行、node -e "console.log(1+1)"は一行実行です。
はを管理します。に名前・版・・dependenciesが書かれます。npm installで依存を入れ、npm run startでscriptsを実行します。は一度きり実行用です。
コマンドを選ぶとターミナルに入力されます。
多くのツール導入の前提がだと説明する
Claude Code・Codex・Grok・の代表的な導入コマンドを知る
グローバル導入(-g)と一度きり実行()を区別する
導入後にバージョン確認する習慣を持つ
現代の開発はエディタだけでは終わりません。(Grok Build、Codex、Claude Code)、、マネージャがで動きます。レッスン10のNode/がその土台です。
公式手順は変わるので常に公式ドキュメントを優先してください。Claude Code: -fsSL ://claude.ai/install.sh | (または install -g @anthropic-/claude-code)。OpenAI Codex: curl -fsSL https://chatgpt.com/codex/install.sh | sh(または npm install -g @openai/codex)。Grok: 公式インストーラまたは npm install -g @xai-official/grok。: npm install -g firebase-tools。導入後は claude --version などで確認します。
| は信頼できる公式からだけ。グローバルで権限エラーならよりを直します。チーム・CIではdevDependencyで版を固定すると安全です。
コマンドを選ぶとターミナルに入力されます。
-cや -eで他の言語を一行実行できる
プログラムをファイルに保存してpython3 ファイル.pyで実行できる
ヒアドキュメント(<<PY)で複数行のプログラムをに渡せる
sedでファイルのテキストを一括修正できる
awkで表形式データから列を取り出し集計できる
AIが書いたコードを実行する前に安全に確認できる
だけですべて計算しようとするとすぐ壁にぶつかります。シェルは「誰をいつ呼ぶか」を決める指揮者です。計算やデータはPython、表の集計は、テキストの一括修正はに任せ、シェルはその結果をつなぎます。シェルが分かれば、学んだことのない言語も呼び出して使えます。
多くの言語は「コードをで受け取ってすぐ実行する」を持っています。Pythonは -c "コード"、は -e "コード"、Perlはperl -e、Rubyはruby -eです。電卓の代わりにpython3 -c "print(2**10)"と打つ習慣だけで、は格段に強力になります。
一度きりでないプログラムはファイルに保存します。hello.pyにコードを書いておけば、 hello.pyでそのまま実行できます。レッスン5で学んだを1行目に#!/usr/bin/env python3と書き、 +x hello.pyでを与えると、python3を前に付けずに./hello.pyだけで動きます。実行後に と打てば成功(0)か失敗(1)かが分かるので、レッスン8のとおり&&で次のにつなげられます。
プログラムが複数行になると-cでは不便です。そこで使うのがです。 - <<'PY'と書くと、次の行からPYと書いた行の直前までがまとめてPythonのに渡ります。間の-は「ファイルではなく標準入力からコードを読め」という意味です。コーディングがファイルを修正するときによく使う形がこれです。
終了タグをで囲むと(<<'PY')本文がそのまま渡ります。囲まないと(<<PY)本文の$や$()をが先に置き換えます。Pythonコードに$はあまり出ませんが、やに$があると静かに壊れるので、コードを渡すときは囲む形が基本です。
's/探す/置き換える/'は各行で最初の一つを、末尾にgを付けると(s/…/…/g)その行のすべてを置き換えます。前に行番号や//を付けて対象行を選び(2s/…/…/、/error/s/…/…/)、-nとpを組み合わせると選んだ行だけ出力します。-iを付けると画面ではなくファイル自体を書き換えます。区切り文字は/でなくてもよく、の置換はs|/old/path|/new/path|の方がずっと読みやすくなります。ファイル自体を書き換えるときはsed -i.bak 's/探す/置き換える/' ファイルを使いましょう。元のファイルをファイル.bakとして残す形なので安全で、macOSとLinuxのどちらでも同じように動きます。Linux(GNU sed)だけならsed -iのようにバックアップ名を省略できますが、macOSのsedは-iの後に名前を必ず要求するため、そのまま打つとエラーになります(macOSでバックアップなしに書き換えるならsed -i '' '…' ファイルの形です)。
はではなく言語そのものです。行を空白で分けて$1・$2・$3と呼び、NFは列数、NRは行番号です。基本形はawk 'パターン { 処理 }'で、パターンを省くと全行、処理を省くと行全体の出力になります。先頭にBEGIN{}、末尾にEND{}を置けば準備と仕上げができるので、合計・平均・項目別集計が一行で終わります。
から受け取り標準出力へ流すように作られたプログラム同士は、で自由につなげます。 sales.txt | '{print $2}' | -n | -3と書けば「ファイルを読む → 2列目を取る → 数値で並べる → 大きい3つだけ」が一行で完成します。awk・はこうしてパイプでつなぎ、Pythonは-cやでコードを渡すのが基本です。これがは指揮者だという言葉の本当の意味です。
はたいていこのの形で答えます。貼り付ける前に三つだけ確認しましょう。①どのファイルを触るのかを目で読む。②rmや>で上書きする箇所がないか見る。③大事なファイルなら 元 元.bakで先にバックアップを取る。を読めるということは、AIの答えを検証できるということです。
コマンドを選ぶとターミナルに入力されます。
ユーザーに値をたずねて、に入れます。変数を前もって宣言しておく必要はありません。
echo "名前は何ですか?"# 質問を画面に表示read name# 答えを変数 name に読み込むecho "こんにちは、$name!"# 受け取った値を使うの代わりに、 $PWD でもが分かります。かっこ ( ) で囲んだコマンドは別ので動くので、その中で しても外の現在地は変わりません。
echo "今いる場所は $PWD です"# で現在のを使う(cd /tmp; pwd)# サブシェルの中だけで移動 → /tmp を表示pwd# 外は元の場所のままclear(または Ctrl-L)で画面を片付けます。知らないは三種類のヘルプで調べます — 組み込みコマンドは help、マニュアルは man、詳しい文書は info です。
clear# の画面を消す(Ctrl-L と同じ)help for# for のような組み込みコマンドのヘルプman ls# のマニュアルページ(q で終わる){ } の中に値を並べたり範囲を書いたりすると、がたくさんの名前を一度に作ります。フォルダーの構成を一行で作るときに特に便利です。
mkdir -p project/{src,tests,docs}# 三つのフォルダーを一度に作るtouch file{1..5}.txt# file1.txt から file5.txt まで五つのファイルを作るcp config.yaml{,.bak}# バックアップの小技 — config.yaml → config.yaml.bakで消したものは元に戻せません。-i(一つずつ確認する)と -v(消したものを表示する)でうっかりミスを減らせます。trash- を使えば、代わりにゴミ箱へ送ります。
rm -i old.txt# 消す前に、本当に消すかたずねるrm -v *.tmp# 何を消したかを表示するrm -r tempDir/# フォルダーと中身をすべて消す(注意!)はで並べ方と表示の形を変えます。次の三つは覚えておく価値があります。
ls -l# 一行に一つずつ、詳しくls -t# 最近変更したものから順にls -R# すべてのサブフォルダーの中まで(再帰的)${ } の中では、値を取り出すと同時に、その一部を切り取ったり置き換えたりできます。の値を加工するいちばん強力な道具です。
echo "${var/Some/A}"# 最初の Some を A に置き換えるecho "${var//Some/A}"# // ならすべての Some を A に置き換えるecho "${var:0:7}"# 0 番目から 7 文字だけ(部分)echo "${#var}"# 文字列の長さが空のときのデフォルト値を決めたり、大文字と小文字を一度に変えたりできます。
echo "${foo:-デフォルト値}"# foo が空なら「デフォルト値」を代わりに使う: "${NAME:=ゲスト}"# NAME がなければ「ゲスト」を入れて、そのまま残すecho "${var^^}"# すべて大文字( 4 以降)echo "${var,,}"# すべて小文字# は前から、% は後ろから切り取ります。二つ重ねると(##、%%)できるだけ長く切り取るので、からファイル名やフォルダーだけを取り出せます。
path="/usr/local/bin/run.sh"# 例のパスecho "${path##*/}"# 最後の / までを消す → run.sh ()echo "${path%/*}"# 最後の / から後ろを消す → /usr/local/bin (dirname)echo "${path%.sh}"# 拡張子 .sh だけを消すかっこの中に複数の値を入れ、[番号] で一つを、[@] ですべてを取り出します。${#array[@]} で個数を数えます。
array=(りんご バナナ ぶどう)# 三つの値を持つを作るecho "${array[0]}"# 1 つ目 → りんご(番号は 0 から)echo "${array[@]}"# 全部 → りんご バナナ ぶどうecho "${#array[@]}"# 個数 → 3-A で作る連想は、「名前 → 値」の組で値をしまいます(ほかの言語の辞書やマップのようなものです)。
declare -A person# 連想配列を宣言するperson[name]="花子"# 名札 name に値をしまうecho "${person[name]}"# 取り出す → 花子for k in "${!person[@]}"; do echo "$k"; done# すべてのキーを順にたどるがあらかじめ値を入れておくがあります。は $(( )) の中で行い、べき乗や余りも計算できます。小数の計算には を使います。
echo "$?"# 直前のの(0 = 成功)echo "$RANDOM"# 0 から 32767 までの乱数echo "$(( 2 ** 10 ))"# べき乗 → 1024echo "scale=2; 10/3" | bc# 小数の計算 → 3.33はシステムによって動きが少しずつ違います。 はどこでも同じように動き、桁数・そろえ方・小数点以下の桁を正確に決められます。
printf "こんにちは、%s!\n" "世界"# %s の場所に値が入る → こんにちは、世界!printf "%.2f\n" 3.14159# 小数第 2 位まで → 3.14printf "%05d\n" 42# 0 で埋めて 5 桁に → 00042一つの値をたくさんのパターンと比べるときは、if を何度も重ねるより case のほうがすっきりします(ほかの言語の switch に似ています)。
case "$x" in# x の値によってする 0) echo "ゼロ";;# 0 のとき 1) echo "いち";;# 1 のとき *) echo "それ以外";; esac# * はそれ以外のすべてに一致する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# 条件が偽のあいだ=~ は、がのパターンに合うかを調べます。-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: 空か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が -v や -f ファイル名 のようなを受け取れるようにする標準の道具です。文字の後ろのコロン(:)は「このオプションには値が必要」という意味です。
while getopts ":vf:" opt; do# v は値なし、f は値が必要 case $opt in# オプションごとにする v) verbose=true ;;# -v なら verbose をオンにする f) file="$OPTARG" ;; esac; done# -f の値は に入るsource(または .)は、別のファイルを現在ので実行して、そのや設定を読み込みます。export はをにも渡します。
source ./lib/helpers.sh# 別のファイルの関数と変数を現在のシェルに読み込む. ~/.bashrc# . は source の短い書き方export API_KEY="abc123"# 子プロセスからも見えるようにするはを使うとずっと強力になります。再帰検索・行番号・除外・数え上げを組み合わせます。
grep -r "TODO" ./src# -r: フォルダー全体を再帰的に検索grep -n "error" app.log# -n: 行番号付きでgrep -v "debug" app.log# -v: その言葉がない行だけ(逆)grep -c "error" app.log# -c: 何行あるかだけは流れていくテキストをその場で編集します。置換・削除・範囲の指定ができ、-i でファイルそのものを書き換えます(バックアップを残しましょう)。
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 を含む行だけ表示は各行を空白(または -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 列目の合計小さな道具をでつなぐと、強力なデータ処理ができます。 は、前のの出力を次のコマンドのに変えます。
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)<< EOF()は、複数行のテキストをひとまとめにしての入力に渡します。<<<()は、短い一行を入れる手軽な方法です。
cat << EOF# EOF までの行が入力になる複数行の
テキスト
EOF# 二つの EOF のあいだが中身grep "バナナ" <<< "りんご バナナ ぶどう"# <<< で一行を入力(stdout)と標準エラー(stderr)は別々の通り道を通ります。2> はエラーだけを、2>&1 はエラーを出力と同じ場所へ送ります。/dev/null は捨てる場所です。
command 2> error.log# エラーメッセージだけをファイルへcommand > out.log 2>&1# 出力とエラーをまとめて out.log へcommand > /dev/null 2>&1# 出力もエラーも捨てる(静かに実行)<() は、コマンドの出力をまるでファイルのように渡します。二つのコマンドの結果を、一時ファイルなしでそのまま比べるときに便利です。
diff <(ls dir1) <(ls dir2)# 二つのフォルダーの一覧をそのまま比べるwhile read l; do echo "$l"; done < <(ls)# の中で設定したが、ループの後も残る$() は、コマンドの結果を値のように文の中にはめ込みます。バッククォート(`)より $( ) を使いましょう — 入れ子にできます。
echo "ここには $(ls | wc -l) 個のファイルがあります"# ファイルの数を文にはめ込むtoday=$(date +%Y-%m-%d)# 今日の日付をに入れるtrap は、が(終了・エラー・中断)を受け取ったときに実行するを決めます。一時ファイルの後片付けに特に便利です。
TMP=$(mktemp)# 安全な一時ファイルを作るcleanup() { rm -f "$TMP"; }# 後片付けのtrap cleanup EXIT# スクリプトが終わるとき、必ず後片付けするtrap 'echo 中断しました; exit 1' SIGINT# Ctrl-C を押されても安全にの先頭に set のを置くと、エラーに強くなります。-e(エラーで止まる)・-u(未設定のを許さない)・-o pipefail(の失敗に気づく)を一緒に使います。-x は用です。
set -euo pipefail# 丈夫なスクリプトの定番の 1 行目set -x# 実行するを一つずつ表示(デバッグ)set +x# デバッグをやめるの後ろに & を付けると、で実行します。jobs で一覧を見て、wait で終わるまで待ちます。
sleep 5 &# バックグラウンドで実行jobs# まだ動いているバックグラウンドジョブの一覧wait# すべてのバックグラウンドジョブが終わるまで待つtime sleep 1# コマンドにかかった時間を測る実際ので何度も出てくる守りの型です — 必要な値を確かめる、があるか確かめる、失敗したらすぐ止める。
: "${VAR:?VAR が必要です}"# VAR がなければエラーを出して止まるcommand -v jq && echo "jq あり"# コマンドがインストールされているか確かめるcp a b || { echo 失敗; exit 1; }# 失敗したらメッセージを出して止まるset -euo pipefail は三つのを合わせたものです。それぞれがどんな事故を防ぐのかが分かると、なぜ定番になったのかが見えてきます。
set -e# どれか一つでもが失敗したら、すぐに止まるset -u# 定義していないを使うとエラー(打ち間違いを見つける)set -o pipefail# の途中の一段が失敗したら、パイプ全体を失敗にするは、ファイル名の照合()のしかたを調整します。globstar は ** をサブフォルダーの中まで届かせ、nullglob は何も一致しないとき空の値にします。
shopt -s globstar# ** がサブフォルダーの中まで一致する( 4 以降)for f in **/*.sh; do echo "$f"; done# すべてのサブフォルダーにある .sh ファイルshopt -s nullglob# 一致しないとき、パターンの文字ではなく空の値になる(内部フィールド区切り文字)は、単語分割でどこを区切るかを決めます。ファイルを一行ずつ安全に読むには、IFS= と read -r を一緒に使います。
IFS=',' read -ra f <<< "a,b,c"# カンマで分けて f に入れるwhile IFS= read -r line; do# 空白や特殊文字をそのまま残す echo "$line"; done < file.txt# 一行ずつ安全に読むプロジェクトによって、必要な 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# 切り替えたバージョンを確認の は、_modules/.bin を に加えた状態で実行されます。だから、プロジェクトの道具をグローバルにインストールしなくても使えます。
npm init -y# package.json をすばやく作るnpm install lodash# 実行時の依存パッケージを追加npm install -D typescript# 開発のときだけ使う依存パッケージnpm run build# scripts.build を実行グローバルにインストールせずに、最新版の道具を一度だけ動かすときは を使います。バージョンがよく変わる に特に便利です。
npx create-next-app@latest my-app# プロジェクトのひな形を作る例npx prettier --write .# ローカルの、またはダウンロードした prettier を実行npx --yes cowsay hello# 確認なしで一度だけ実行公式のインストールか、 のグローバルでインストールします。インストールしたらすぐ、バージョンを表示するで確かめましょう。
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# インストールの確認(例)デプロイ・ログイン・ホスティングに使う は、速いマネージャーの pnpm と一緒にインストールすることがよくあります。
npm install -g firebase-tools# Firebase CLIfirebase login# でログインfirebase projects:list# プロジェクトの一覧npm install -g pnpm# pnpm をグローバルにインストールインストールはできたのにが見つからないなら、 の問題です。which で場所を確かめ、 の設定を見直しましょう。
which node npm# プログラムがある場所echo "$PATH"# 検索を確認npm config get prefix# グローバルインストールの行き先command -v firebase || echo "not found"# インストールされているか確かめるほとんどの言語には、「コードをで受け取って、すぐに実行する」があります。違うのはオプションの文字だけで、使い方は同じです。
python3 -c "import sys; print(sys.version)"# Python の一行実行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 を使うにコードの修正を頼むと、答えはほとんどこの形になります。ファイルを読み、を置き換えて書き戻す小さな Python プログラムを、で渡す形です。大事なのは、置き換える対象が本当にあるかを、先に 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 でも Linux でも同じように動きます。
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 で空白を含むファイル名も安全に、バックアップも残る)Learn X in Y Minutes(Bash、CC BY-SA)を参考に再構成しました。一部は参照専用です。