【Bash講座 第7回】その作業、自動化できるよ。「シェルスクリプト」の書き方と変数の基礎

bash講座

【Bash講座 第7回】毎回同じコマンド打ってない?「シェルスクリプト」で全自動化への第一歩

こんにちは!「リナックス先生」です。
前回は、最強エディタ「Vim」を使ってファイルを編集する方法をマスターしました。
コウ君、Vimの操作には慣れてきた?

コウ君

先生!:wq で保存するのは無意識にできるようになりました!
でも、毎日サーバーに入って、ログを確認して、バックアップを取って…っていう一連のコマンドを毎回打つのが面倒になってきました。
間違えそうだし、なんとかなりませんか?

リナックス先生

その「面倒くさい」という感情こそが、エンジニアを進化させる原動力よ!
それなら、複数のコマンドをテキストファイルにまとめて、一発で実行できるようにすればいいわ。
それが「シェルスクリプト」よ。
今回からは、いよいよプログラミングの世界に足を踏み入れるわよ!

第7回となる今回は、自動化の第一歩となる「シェルスクリプト」の書き方、そしてプログラムの基本である「変数」「引数」について解説します。
これを使えば、複雑な手順も「コマンド一発」で終わるようになります。

本講座のカリキュラム(全12回)

AlmaLinux 9 (RHEL 9互換) 環境を前提に、基礎から応用までステップバイステップで進めます。

  1. Bash入門編:シェルとカーネルの関係、CUIの哲学、環境構築
  2. ファイル操作の極意:絶対パス・相対パスと「ワイルドカード」の魔術
  3. 権限(パーミッション)とユーザー:chmod, chown, sudoの仕組みを完全理解
  4. 入出力リダイレクトとパイプ:Linuxの真骨頂!コマンド同士を連携させる技術
  5. テキスト処理の基本:cat, head, tail, less…ファイルの中身を覗く道具たち
  6. 最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
  7. 【今回】シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
  8. 条件分岐(if文):サーバーの状態を見て「判断」できるスクリプトを作る
  9. 繰り返し処理(for/while文):面倒な単純作業を1秒で終わらせるループ処理
  10. テキスト処理の応用:grep, sed, awk…ログ解析の達人になるための三種の神器
  11. 実践・自動化スクリプト:バックアップと監視を自動化し、Cronで定期実行する
  12. 総仕上げ:自作スクリプトの集大成と、エンジニアとしての歩き方

1. 初めてのシェルスクリプト「Hello World」

シェルスクリプトとは、簡単に言えば「コマンドを羅列したテキストファイル」のことです。
まずは実際に作って動かしてみましょう。

Step 1: ファイルを作成する

Vimを使って、hello.sh というファイルを作ります。
(拡張子 .sh はなくても動きますが、つけるのがマナーです)

[root@localhost ~]# vi hello.sh

中身を以下のように書いて保存してください。

#!/bin/bash
echo "Hello, Shell Script World!"
date

💡 1行目の #!/bin/bash って何?

これを「Shebang(シバン)」と呼びます。
「このファイルは /bin/bash というプログラムを使って実行してくださいね」というLinuxへの宣言です。
これがないと、別のシェルで実行されてエラーになる可能性があります。必ず1行目に書くのが鉄則です。

Step 2: 実行権限をつける

第3回で学んだ「パーミッション」を思い出してください。
作ったばかりのファイルには「実行権限(x)」がありません。

# 自分に実行権限(x)を付与する
[root@localhost ~]# chmod u+x hello.sh

Step 3: 実行する

ファイルパスを指定して実行します。
カレントディレクトリにあるファイルを実行する場合は、先頭に ./ をつけます。

[root@localhost ~]# ./hello.sh
Hello, Shell Script World!
Wed Jan 10 10:00:00 JST 2024
コウ君

動いた! echodate が一気に実行されました!
これがプログラミングの第一歩なんですね!

2. データを箱に入れる:「変数」の基礎

プログラミングにおいて、データを入れておく箱のことを「変数(Variable)」と呼びます。
Bashでの変数の扱いは、他の言語と少し違うクセがあるので注意が必要です。

変数のルール

  • 代入する時: 変数名=値※=の前後にスペースを入れてはいけない!
  • 使う時: $変数名 または ${変数名}

実際にやってみよう

myvar.sh を作成します。

#!/bin/bash

# 変数 NAME に "Linux" を入れる
NAME="Linux"

# 変数の中身を表示する
echo "Hello, $NAME"

# 変数を連結する時は {} で囲むと安全
echo "I am learning ${NAME}Server."

実行結果:

Hello, Linux
I am learning LinuxServer.
リナックス先生

初心者が一番ハマるのが「=の周りのスペース」よ。
NAME = "Linux" と書くと、「NAMEというコマンドを実行して、引数に=とLinuxを渡す」と解釈されてエラーになるの。
「代入はキツキツに詰める」と覚えてね。

3. コマンドの結果を変数に入れる:「コマンド置換」

「今日の日付」や「現在のファイル数」など、コマンドの実行結果を変数に入れたい時は、$( ) で囲みます。

#!/bin/bash

# dateコマンドの結果を変数 TODAY に入れる
TODAY=$(date +%Y%m%d)

# バックアップファイル名を作る
FILENAME="backup_${TODAY}.tar.gz"

echo "本日のバックアップファイル名は $FILENAME です"

実行結果:

本日のバックアップファイル名は backup_20240110.tar.gz です

これを使えば、「毎日違う名前でバックアップを作るスクリプト」が簡単に作れますね!

4. 重要な脇役:「引用符」の使い分け

Bashには、文字列を囲む記号として「シングルクォート '」と「ダブルクォート "」があります。
この2つは明確に役割が違います。

記号 名称 機能 変数はどうなる?
" " ダブルクォート 中身を解釈する(弱い囲み) 展開される
"$NAME"Linux
' ' シングルクォート 中身を文字そのままと扱う(強い囲み) 展開されない
'$NAME'$NAME という文字
name="Kou"
echo "Hello $name"   # -> Hello Kou
echo 'Hello $name'   # -> Hello $name

5. 外からデータを受け取る:「引数(ひきすう)」

スクリプトを実行する時に、外から情報を渡したいことがあります。
例えば ./greet.sh Kou のように実行した時、Kou という文字をスクリプト内で使いたい場合です。

これを「コマンドライン引数」と呼び、特殊な変数に自動的に入ります。

変数 中身
$1 1番目の引数
$2 2番目の引数
$0 実行されたスクリプト自身の名前
$# 引数の数(何個渡されたか)

引数を使うスクリプト例

greet.sh を作成します。

#!/bin/bash

echo "こんにちは、$1 さん!"
echo "あなたの好きな食べ物は $2 ですね?"

実行してみましょう。引数を2つ渡します。

[root@localhost ~]# ./greet.sh コウ君 ラーメン
こんにちは、コウ君 さん!
あなたの好きな食べ物は ラーメン ですね?
コウ君

すごい! スクリプトの中身を書き換えなくても、実行する時に渡す言葉を変えるだけで動きが変わるんですね!

次回予告:スクリプトに「知能」を持たせる

第7回は、シェルスクリプトの基本構造と、変数・引数の使い方について解説しました。
「日付入りのファイル名を自動で作る」なんて、いかにもエンジニアっぽい作業ですよね。

しかし、今のままでは「上から順に実行するだけ」です。
次回は、「もしファイルが存在しなかったら作成する」「もしエラーが出たら処理を止める」といった判断を行わせるための「条件分岐(if文)」を学びます。
これを知ると、スクリプトが一気に「賢く」なりますよ。

リナックス先生

次回までに、以下の課題にチャレンジしてみてね。
「引数で指定したディレクトリを、日付入りのtar.gzファイルに圧縮してバックアップするスクリプト」
これが作れれば、もう初心者は卒業よ!

▼スクリプトの実験場に最適!推奨VPS

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント