こんにちは!「リナックス先生」です。ついにこの連載も最終回を迎えたわね。ここまでついてきてくれたコウ君、そして読者の皆さん、本当によく頑張ったわ!
第1回から第7回まで、私たちはLinuxの基礎を一つずつ積み上げてきたわね。今日、その知識が一本の線に繋がるわ。今回のテーマは「シェルスクリプト」。これまで手で打ち込んできたコマンドを一つのファイルにまとめ、一発で実行できるようにする魔法の技術よ。
先生!「:wq」で保存するのは無意識にできるようになりました! でも、毎日サーバーに入って、ログを確認して、バックアップを取って…っていう一連のコマンドを毎回打つのが面倒になってきました。 間違えそうだし、なんとかなりませんか?プログラミングなんてやったことない僕でも書けますか?
その「面倒くさい」という感情こそが、エンジニアを進化させる原動力よ! シェルスクリプトは、簡単に言えば「コマンドを羅列したテキストファイル」のこと。 難しく考えなくていいのよ。今回で、いよいよプログラミングの世界に足を踏み入れるわよ!
本講座のカリキュラム(全8回)
- 第1回:マウスからの脱却!Linuxの基本思想と「環境構築」
- 第2回:もう迷子にならない!ディレクトリ構造の理解とファイル操作
- 第3回:Windowsにはない壁!「ユーザー権限」と「パーミッション」を攻略
- 第4回:エクスプローラーより100倍速い!ファイル検索とテキスト閲覧
- 第5回:最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
- 第6回:ソフトの追加とネットワークの基礎!Webサーバーを立ち上げよう
- 第7回:Linux最大の魔法!「パイプ」と「リダイレクト」でコマンドを繋ぐ
- 【今回】第8回:シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
目次
1. 初めてのシェルスクリプト「Hello World」:シバンと実行権限
① 概念と背景(Why)
WindowsユーザーがLinuxを操作する際、最も大きな壁を感じるのが「自動化」への移行よ。GUI環境ではバッチファイルを作成する機会も減っているけれど、Linuxでは日常的な定型作業をファイルにまとめ、一発で実行できるようにするのがマナーなの。 なぜこれが必要かというと、手動でコマンドを打ち続けることは「時間の浪費」だけでなく、「打ち間違いによる事故」のリスクを常に孕んでいるからよ。 複数のコマンドをテキストファイルに羅列し、OSに一括処理させる……これがシェルスクリプトの原点ね。
特に重要なのが、1行目に書く「Shebang(シバン)」よ。 これはLinuxに対して「このファイルはどのプログラム(シェル)を使って動かすべきか」を伝える宣言なの。 これがないと、別のシェルで実行されて予期せぬエラーになる可能性があるわ。 プログラミング未経験でも大丈夫、まずは実際に作って動かすところから始めましょう!
② 実践手順と完全なコード(How)
まずは、最もシンプルな構成でスクリプトを作ってみるわよ。
# Step 1: Vimを使って hello.sh というファイルを作成する [root@localhost ~]# vi hello.sh # --- 以下をファイルの中身に記述して保存 --- #!/bin/bash echo "Hello, Shell Script World!" date # --- ここまで --- # Step 2: 自分に実行権限(x)を付与する [root@localhost ~]# chmod u+x hello.sh # Step 3: ファイルパスを指定して実行する [root@localhost ~]# ./hello.sh
③ プロによるコードの「1行・1オプション」徹底解説
- #!/bin/bash:「Shebang(シバン)」と呼ぶわ。 「このファイルは /bin/bash というプログラムを使って実行してくださいね」というLinuxへの宣言よ。 必ず1行目に書くのが鉄則ね。
- echo “Hello, Shell Script World!”:指定した文字列を画面に出力するコマンドよ。
- date:現在の時刻を表示するコマンドよ。 これにより `echo` と `date` が一気に実行されるわ。
- chmod u+x:第3回で学んだパーミッション操作ね。 作ったばかりのファイルには「実行権限(x)」がないから、自分(u)に権限を付与する必要があるわ。
- ./hello.sh:カレントディレクトリにあるファイルを実行する指定よ。 先頭に `./` をつけるのがLinuxの作法ね。
④ 現場のリアル(失敗談とノウハウ)
初心者が必ずと言っていいほどハマるのが「シバンの書き間違い」よ。 `#! /bin/bash` のように、`#!` と `/` の間にスペースを入れてしまったり、2行目に書いてしまったりすると、シェルスクリプトとして正しく認識されないわ。 現場では「動かない!」とパニックになる前に、まず1行目が正しく書けているかを確認するのがプロの第一歩ね。また、拡張子 `.sh` はなくても動くけれど、後から自分や仲間が見た時に「これはスクリプトだ」と一目でわかるように付けるのが、エンジニアとしての優しさよ。
2. データを箱に入れる:「変数」の基礎と代入の鉄則
① 概念と背景(Why)
プログラミングにおいて、データを入れておく箱のことを「変数(Variable)」と呼ぶわ。 なぜこれが必要かというと、同じ値を何度も使い回したり、計算結果を一時的に保存したりするためよ。スクリプトが大きくなればなるほど、値を一箇所で管理できる変数の恩恵は計り知れないわ。
Bashでの変数の扱いは、他のプログラミング言語(PythonやJavaScriptなど)と比べて非常に「厳しい」ルールがあるわ。 特にWindowsのバッチファイルなどから移行してきた人が一番驚くのが、代入時のスペースの扱いね。 この作法を身につけないと、単純な代入すらエラーになって、先に進めなくなってしまうわよ。
② 実践手順と完全なコード(How)
変数の宣言と、文字列との連結方法を学びましょう。
# Step 1: myvar.sh を作成する
[root@localhost ~]# vi myvar.sh
# --- ファイルの中身 ---
#!/bin/bash
# 変数 NAME に "Linux" を入れる
NAME="Linux"
# 変数の中身を表示する
echo "Hello, $NAME"
# 変数を連結する時は {} で囲むと安全
echo "I am learning ${NAME}Server."
# --- ここまで ---
# 実行結果
Hello, Linux
I am learning LinuxServer.
③ プロによるコードの「1行・1オプション」徹底解説
- NAME=”Linux”:変数の代入よ。 最も重要なルールは「=の前後にスペースを入れてはいけない」ことよ。
- $NAME:変数の中身(値)を使う時は、変数名の前に `$` を付けるわ。
- ${NAME}Server:変数を他の文字列と連結する時は、このように波括弧で囲むのが安全よ。 これにより、どこまでが変数名かをシェルに正確に伝えられるわ。
④ 現場のリアル(失敗談とノウハウ)
初心者が一番ハマるのが「=の周りのスペース」よ。 NAME = "Linux" と書くと、「NAMEというコマンドを実行して、引数に=とLinuxを渡す」と解釈されてエラーになるの。 「代入はキツキツに詰める」と覚えてね。
3. コマンドの結果を変数に入れる:「コマンド置換」の威力
① 概念と背景(Why)
固定の文字列を変数に入れるだけでは、本当の自動化は達成できないわ。システムの動的な情報、例えば「今日の日付」や「サーバーの負荷状況」などを取得して変数に閉じ込めたい時に使うのが「コマンド置換」よ。
本気で学ぶ Linux実践入門 サーバ運用のための業務レベル管理術 [ 大竹龍史 ] 価格:3278円 |
WindowsのGUIでは、日付入りのファイルを作る際、わざわざカレンダーを見てファイル名を打ち込むでしょう?Linuxでは、コマンドの実行結果をそのまま変数として扱えるの。 これを使えば、「毎日違う名前でバックアップを作るスクリプト」が簡単に作れるようになるわ。 自動化の「知能」となる部分ね。
② 実践手順と完全なコード(How)
日付を変数に取得して、ファイル名を生成する例よ。
# バックアップファイル名生成スクリプト
#!/bin/bash
# dateコマンドの結果を変数 TODAY に入れる
TODAY=$(date +%Y%m%d)
# バックアップファイル名を作る
FILENAME="backup_${TODAY}.tar.gz"
echo "本日のバックアップファイル名は $FILENAME です"
# 実行結果(例)
本日のバックアップファイル名は backup_20240110.tar.gz です
③ プロによるコードの「1行・1オプション」徹底解説
- $(date +%Y%m%d):コマンド置換の記法よ。 `$( )` で囲まれたコマンドが実行され、その出力結果が変数に代入されるわ。
- date +%Y%m%d:日付を「20240110」のような形式で出力するコマンドよ。
- FILENAME=”backup_${TODAY}.tar.gz”:取得した日付変数を使って、特定の形式の文字列を組み立てているわ。
④ 現場のリアル(失敗談とノウハウ)
コマンド置換を引用符で囲む際、シングルクォート `’ ‘` を使うと大失敗するわよ! 第7回でも触れたけれど、シングルクォートは「中身を文字そのままと扱う」強い囲みだから、変数が展開されずに `$(date)` という文字がそのまま表示されちゃうの。 現場で変数の値を展開したい時は、必ず「中身を解釈する(弱い囲み)」であるダブルクォート `” “` を使ってね。
| 記号 | 機能 | 変数はどうなる? |
|---|---|---|
" " |
中身を解釈する | 展開される(”$NAME” → Linux) |
' ' |
文字そのまま扱う | 展開されない(’$NAME’ → $NAME) |
4. 外からデータを受け取る:「引数」による汎用スクリプトの作成
① 概念と背景(Why)
最後は、スクリプトを実行する時に「外から情報を受け取る」方法を学びましょう。これを「コマンドライン引数(ひきすう)」と呼ぶわ。 例えば `./greet.sh Kou` と実行した時、この `Kou` という情報をスクリプト内で利用するための仕組みね。
なぜこれが必要かというと、引数を使えば「スクリプトの中身を書き換えなくても、実行する時に渡す言葉を変えるだけで動きが変わる」からよ。 汎用的なツールを作るには欠かせない技術ね。 Linuxのコマンドは、特殊な変数にこの引数を自動的に格納してくれるのよ。
② 実践手順と完全なコード(How)
引数を2つ使ってメッセージを出すスクリプトよ。
# greet.sh を作成する #!/bin/bash echo "こんにちは、$1 さん!" echo "あなたの好きな食べ物は $2 ですね?" # 実行方法 [root@localhost ~]# ./greet.sh コウ君 ラーメン # 実行結果 こんにちは、コウ君 さん! あなたの好きな食べ物は ラーメン ですね?
③ プロによるコードの「1行・1オプション」徹底解説
- $1 / $2:特殊な変数よ。 `$1` には1番目の引数、 `$2` には2番目の引数が自動的に入るわ。
- $0:実行されたスクリプト自身の名前(./greet.shなど)が入っているわ。
- $#:引数の数(全部で何個渡されたか)が入るわ。 引数が足りない時にエラーメッセージを出すのに便利ね。
④ 現場のリアル(失敗談とノウハウ)
引数を多用するようになると、「引数を渡す順番を間違える」というミスが多発するわ。現場では `$1` や `$2` を直接使うのではなく、スクリプトの冒頭で `TARGET_DIR=$1` のようにわかりやすい名前の変数に代入し直すのが、可読性を高めるプロの技よ。さあ、今回の卒業課題はこれよ! 「引数で指定したディレクトリを、日付入りのtar.gzファイルに圧縮してバックアップするスクリプト」。 これが作れれば、もう初心者は卒業よ!
すごい!スクリプトの中身を書き換えなくても、渡す言葉を変えるだけで動きが変わるんですね! 動いた時は本当に感動しました!先生、全8回の講義、本当にありがとうございました!
いい自信ね!その調子よ。あなたはもう、ただのWindowsユーザーじゃない。Linuxの大地を自分の力で開拓するエンジニアの仲間入りをしたの。もし迷ったら、いつでもこの連載に戻ってきてね。あなたの活躍を、インターネットのどこかで楽しみにしているわよ!
▼ サーバー構築・自動化を学ぶならVPSで ▼
エンジニア必須の環境
「おすすめVPS」
技術スキルを活かす
「ITエンジニア転職」

コメント