第6章 6-1 / シェルの力

変数と環境変数

このページで叩くコマンドと到達点

前提:第5章が完了し、~/practiceが存在し、ユーザーyumi・グループdevteamがあり、tree・htopがインストール済みでufwが有効(OpenSSH許可済み)な状態から始めます。第6章「シェルの力」では、これまで1行ずつ手打ちしてきたコマンドを、まとめて自動で動かすための土台を作っていきます。その第一歩が変数です。変数とは、値を入れておく「名前付きの箱」のこと。このページでは箱を作って中身を取り出す方法、シングルクォートとダブルクォートの違い、そしてexportで使う環境変数、コマンドの居場所を教えてくれるPATHまでを一気に体験します。

このページではSET 1〜3、合計30行のコマンドを上から順に叩きます。手打ち推奨(コピーは確認用)です。

SET 1 ― 変数という名前付きの箱を作る

ubuntu@lightsail: ~
  1. $NAME='yumi'
  2. $echo NAME
  3. NAME
  4. $echo $NAME
  5. yumi
  6. $echo "Hello, $NAME"
  7. Hello, yumi
  8. $echo 'Hello, $NAME'
  9. Hello, $NAME
  10. $NAME="yumi desu"
  11. $echo $NAME
  12. yumi desu
  13. $echo "${NAME}!"
  14. yumi desu!
  15. $unset NAME
  16. $echo $NAME
解説 ― SET 1 で何をしたか

1行目のNAME='yumi'が、この章でもっとも大事な操作です。変数※1とは「値を入れておく名前付きの箱」で、変数名=値という書き方で作ります。イコールの前後にスペースを入れないことがポイントで、NAME = 'yumi'のようにスペースを入れると別のコマンドだと解釈されエラーになります。

2行目のecho NAMEは、出力例のとおり文字どおりNAMEという文字列がそのまま表示されるだけです。箱の中身を取り出すには、3行目のように変数名の前に$を付けます。この$NAMEのように$を付けて中身を呼び出す操作を変数展開※2と呼び、出力例のとおり中身のyumiが表示されます。

4行目のecho "Hello, $NAME"のようにダブルクォートで囲むと、中の$NAMEはきちんと展開されてHello, yumiになります。ところが5行目のようにシングルクォートで囲むと、$NAMEという文字がそのまま文字どおり表示され、展開されません。この違いはシェルスクリプトで非常によく事故の原因になるので、「ダブルクォートは展開する、シングルクォートは展開しない」と覚えておきましょう。

6行目のようにスペースを含む値を入れたいときは、NAME="yumi desu"のように全体をクォートで囲みます。8行目のecho "${NAME}!"は6-1で先取りする${}の書き方で、変数名の直後に別の文字を続けても正しく展開できることを確認しています。9行目のunsetは、箱そのものを消してしまうコマンドです。10行目でecho $NAMEを再度実行すると、箱が無くなっているため何も表示されず空行が返ってきます。

ゆみちゃん
ゆみ

あたし最初、$を付け忘れて「なんで中身が表示されないの!?」って何回もハマったよ。$なしは「箱の名前そのもの」、$ありは「箱の中身」。スマホの連絡先で言うなら、名前をタップするか、その人の電話番号を見るかの違いだと思うとイメージしやすいよ!

SET 2 ― exportと環境変数

ubuntu@lightsail: ~
  1. $MYENV="linux-drill"
  2. $bash -c 'echo $MYENV'
  3. $export MYENV="linux-drill"
  4. $bash -c 'echo $MYENV'
  5. linux-drill
  6. $env | grep MYENV
  7. MYENV=linux-drill
  8. $echo $HOME
  9. /home/ubuntu
  10. $echo $USER
  11. ubuntu
  12. $echo $SHELL
  13. /bin/bash
  14. $env | wc -l
  15. $unset MYENV
解説 ― SET 2 で何をしたか

1行目で作ったMYENVは、今のシェルの中だけで使える普通の変数です。2行目のbash -c '...'は、今のシェルの中に新しく別のbashを1つ立ち上げてコマンドを実行する書き方ですが、出力例のとおり結果は空です。これは、普通の変数が「今このシェルだけの持ち物」であり、新しく生まれた子どものシェルには受け継がれないためです。

3行目のexport MYENV="linux-drill"で、この変数にexportという印を付けます。これによりMYENV環境変数※3に昇格し、4行目で改めてbash -c '...'を実行すると、出力例のとおり子どものシェルにもきちんと値が届いています。普通の変数と環境変数の違いは、「自分だけで使うメモ」か「後から生まれてくる子プロセスにも渡す持ち物」かの違いだとイメージしてください。

5行目のenvは、今設定されている環境変数を一覧表示するコマンドです。grep(第3章3-4で学習済み)と組み合わせることで、大量にある環境変数の中からMYENVだけを絞り込んで確認できます。

6行目の$HOME7行目の$USERは、自分で作ったものではなく、ログインした瞬間にUbuntuがあらかじめ用意してくれている環境変数です。$HOMEにはホームディレクトリの絶対パス、$USERには今のユーザー名が入っています。第1章で何度も打ったcd ~は、実はこの$HOMEの値へ移動しているだけなのです。

8行目の$SHELLは、今使っているシェルそのものの実行ファイルの場所を示す環境変数です。9行目のenv | wc -l(wc -lは第1章1-4で学習済み)を実行すると、自分で作ったMYENVを含め、意外とたくさんの環境変数が最初から用意されていることが行数でわかります。最後に10行目で練習用の環境変数を片付けます。

POINT

変数は「自分の引き出しのメモ」、環境変数は「後輩(子プロセス)にも見せる共有の掲示板」とイメージしてください。exportを付けるかどうかで、その値を他のプログラムと共有するかどうかが決まります。

SET 3 ― PATHとコマンド置換

ubuntu@lightsail: ~
  1. $echo $PATH
  2. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin
  3. $which ls
  4. /usr/bin/ls
  5. $which tree
  6. /usr/bin/tree
  7. $whoami
  8. ubuntu
  9. $WHOAMI=$(whoami)
  10. $echo "私は$WHOAMIです"
  11. 私はubuntuです
  12. $TODAY=$(date +%F)
  13. $echo $TODAY
  14. 2026-07-03
  15. $echo "今日は$TODAYです"
  16. 今日は2026-07-03です
  17. $unset TODAY WHOAMI
解説 ― SET 3 で何をしたか

1行目のecho $PATHで表示されるPATHも、$HOMEと同じくあらかじめ用意されている環境変数です。中身は出力例のように:(コロン)区切りのディレクトリの一覧になっています。これが「コマンドが見つかる仕組み」の正体です。lstreeのようなコマンド名を打つと、シェルは$PATHに並んだディレクトリを先頭から順番に探しにいき、同じ名前の実行可能ファイルが見つかった時点でそれを実行します。

2行目・3行目のwhich(第1章1-5で学習済み)は、まさにこの$PATHの中からコマンドが実際にどのファイルとして見つかったかを教えてくれるコマンドです。ls/usr/bin/ls、第5章でインストールしたtree/usr/bin/treeにあることが確認できます。もし自作のコマンドを$PATHに含まれないディレクトリに置いてしまうと、名前を打つだけでは実行してもらえません。

4行目のwhoami(第0章で学習済み)を実行した結果を、5行目のWHOAMI=$(whoami)のように$( )で囲んでそのまま変数に詰め込みます。これがこの章の最後にして最重要のテクニックであるコマンド置換※4です。$(コマンド)という書き方をすると、そのコマンドを実行した結果の文字列を、そのままその場に展開できます。6行目のように文の中に埋め込むと、出力例のとおり「私はubuntuです」のような文章が組み立てられます。

7行目のTODAY=$(date +%F)は、同じコマンド置換をdate +%F(年-月-日の形式で今日の日付を表示するコマンド)に応用した例です。8行目のecho $TODAYで中身を確認すると、出力例のように実行した日の日付が入っています。9行目のようにダブルクォートの中に埋め込んで使うこともでき、日付やユーザー名を含んだメッセージを組み立てるときによく使う形です。コマンド置換は次のページから作るシェルスクリプトの中でも頻繁に登場するので、ここでしっかり体に覚えさせておきましょう。最後に10行目で練習用の変数をまとめて片付け、次のページへ進みます。

ゆみちゃん
ゆみ

$(コマンド)って最初見たとき記号が多くてビビったけど、慣れると「このコマンドの実行結果をここに差し込んでね」ってだけのシンプルな意味なんだよね。TODAY=$(date +%F)みたいに、日付やファイル名を自動で組み立てたいときにめちゃくちゃ活躍するから、次のスクリプト編で何度も出てくるよ!

まとめ

6-1では、変数という「名前付きの箱」の作り方・取り出し方から、クォートの違い、export・環境変数・PATH・コマンド置換までを体験しました。このページで叩けるようになったコマンドを一覧にまとめます。

コマンド何をするか覚え方
変数名=値変数という名前付きの箱を作るイコールの前後にスペースを入れない
echo $変数名変数の中身を展開して表示する$を付けると中身、無いと名前そのもの
"..."(ダブルクォート)中の変数を展開するダブルは中身を見せる
'...'(シングルクォート)中の変数を展開しない(文字どおり扱う)シングルはそのまま見せる
unset 変数名変数を削除するset(設定)の反対
export 変数名=値環境変数にして子プロセスにも渡すexport = 外へ持ち出す
env設定されている環境変数を一覧表示するenvironment(環境)
$HOME / $USER / $PATHあらかじめ用意された環境変数自宅住所・自分の名前・コマンド探索路
$(コマンド)コマンドの実行結果を展開する(コマンド置換)結果をその場に差し込む

次のページ「6-2. 初めてのシェルスクリプト」では、ここで覚えた変数を使いながら、複数のコマンドを1つのファイルにまとめて実行できる「シェルスクリプト」をいよいよ自分の手で書いていきます。

脚注 ─ 用語解説
  1. 変数 … 値を入れておく名前付きの箱。変数名=値で作成し、$変数名で中身を取り出す。
  2. 変数展開$変数名のように$を付けて、変数に入っている実際の値を呼び出す操作。
  3. 環境変数exportを付けた変数のこと。今のシェルだけでなく、そこから生まれる子プロセス(別のプログラムやスクリプト)にも値が引き継がれる。
  4. コマンド置換$(コマンド)という書き方で、コマンドの実行結果をその場の文字列として展開するしくみ。