変更要約: 初版(主題1.03・副主題1.03.1〜1.03.5に対応)
3.1コマンドラインの操作
bash での対話操作の基本を学びます。シェル変数と環境変数の違いと操作(set・unset・export・env・echo)、引用符(シングル・ダブル・バッククォート)の使い分け、コマンド履歴(history・.bash_history)、絶対パス/相対パスと PATH 外コマンドの実行、man によるマニュアル参照を押さえます。
Linux 管理者の主戦場はシェル(標準は bash)です。コマンドを打つだけでなく、変数・引用符・履歴・パス解決というシェルの動作原理を理解しているかが、この後のすべての主題(スクリプト・テキスト処理)の土台になります。
3.1.1シェル変数と環境変数
- シェル変数=
NAME=valueで定義(= の前後にスペースを入れない)。定義したシェル内でだけ有効。参照は$NAME・表示は echo。 - 環境変数=export したシェル変数。子プロセスに引き継がれる(
export LANG=ja_JP.UTF-8)。一覧は env(環境変数のみ)/set(シェル変数も含む全部)。削除は unset。 - 引用符の使い分け=シングルクォート '…':すべて文字どおり(変数展開しない)/ダブルクォート "…":
$変数は展開する/バッククォート \…\(=$(…)):コマンド置換=コマンドの出力に置き換わる。
3.1.2履歴・パス解決・マニュアル
- コマンド履歴=history で一覧、
!番号で再実行、!!は直前のコマンド。履歴はログアウト時に .bash_history へ保存される。 - コマンドは PATH 上から探索される。カレントディレクトリは PATH に含まれないのが原則なので、その場のスクリプトは
./script.sh(相対パス)か 絶対パス で実行する。現在地の確認は pwd。 .(ドット)や source は現在のシェルでスクリプトを読み込む(新しいプロセスを作らない)=設定ファイルの反映に使う。- man=マニュアル参照(
man ls)。man -k キーワード(=apropos)でキーワードから関連コマンドを探せる。
「子プロセスに引き継ぐには export(シェル変数のままでは引き継がれない)」「シングルクォートは展開しない・ダブルは展開する」「./ が要る理由=カレントは PATH に無い」「!! =直前を再実行」 が定番です。VAR = value(スペース入り)がエラーになる点も選択肢でよく突かれます。
「なぜ export が要るのか」を仕組みで理解しましょう。シェルからコマンドを実行すると、シェルは子プロセスを作ってそこでコマンドを動かします。子に渡されるのは環境変数だけなので、LANG=C と定義しただけのシェル変数は子のプログラムからは見えません。export LANG して初めて「環境」の一部になります。引用符は実務ミスの温床で、たとえば echo '$HOME' は文字どおり $HOME を表示し、echo "$HOME" は /home/user01 を表示します。FILES=$(ls *.log) のようなコマンド置換は、スクリプトでコマンドの結果を変数に取り込む基本形です(旧記法のバッククォートも同義)。履歴は history | grep ssh のように過去の複雑なコマンドを発掘する使い方が実務の定番で、!番号 で呼び出せます。マニュアルは「名前がわかる→ man 名前」「名前がわからない→ man -k 機能語」と入口を使い分けます。
| 書き方 | 意味 | 例の結果 |
|---|---|---|
| '$HOME' | 文字どおり(展開なし) | $HOME と表示 |
| "$HOME" | 変数を展開 | /home/user01 と表示 |
| `date` / $(date) | コマンド置換(出力に置換) | 日時文字列に置き換わる |
| export VAR | 環境変数化(子へ継承) | 子プロセスから参照可能 |
ひっかけ: 「シェル変数を定義すれば子プロセスからも参照できる」は誤りです。子に引き継がれるのは export した環境変数だけ。また「env はシェル変数も含めて表示する」も誤り=env は環境変数のみで、シェル変数まで見るのは set です。VAR = value のようにスペースを挟む記法はエラーになります。
3.1.3この節のまとめ
- シェル変数→export→環境変数(子へ継承)。一覧は set(全部)/env(環境のみ)・削除は unset
- '…'=展開なし/"…"=$展開/$(…)=コマンド置換。カレントは PATH 外=./ で実行・履歴は history/!!・調べ物は man(-k)
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. シェルで定義した変数 MYAPP_ENV を、そのシェルから起動する子プロセス(アプリ)からも参照できるようにしたい。適切なコマンドは?
Q2. echo '$USER' を実行したときの出力として正しいのはどれ?(ログインユーザーは user01)
Q3. カレントディレクトリに置いた script.sh を実行しようとしたら「コマンドが見つかりません」と言われた。実行する正しい方法は?

