【Bash講座 第7回】毎回同じコマンド打ってない?「シェルスクリプト」で全自動化への第一歩
こんにちは!「リナックス先生」です。
前回は、最強エディタ「Vim」を使ってファイルを編集する方法をマスターしました。
コウ君、Vimの操作には慣れてきた?
先生!:wq で保存するのは無意識にできるようになりました!
でも、毎日サーバーに入って、ログを確認して、バックアップを取って…っていう一連のコマンドを毎回打つのが面倒になってきました。
間違えそうだし、なんとかなりませんか?
その「面倒くさい」という感情こそが、エンジニアを進化させる原動力よ!
それなら、複数のコマンドをテキストファイルにまとめて、一発で実行できるようにすればいいわ。
それが「シェルスクリプト」よ。
今回からは、いよいよプログラミングの世界に足を踏み入れるわよ!
第7回となる今回は、自動化の第一歩となる「シェルスクリプト」の書き方、そしてプログラムの基本である「変数」と「引数」について解説します。
これを使えば、複雑な手順も「コマンド一発」で終わるようになります。
本講座のカリキュラム(全12回)
AlmaLinux 9 (RHEL 9互換) 環境を前提に、基礎から応用までステップバイステップで進めます。
- Bash入門編:シェルとカーネルの関係、CUIの哲学、環境構築
- ファイル操作の極意:絶対パス・相対パスと「ワイルドカード」の魔術
- 権限(パーミッション)とユーザー:chmod, chown, sudoの仕組みを完全理解
- 入出力リダイレクトとパイプ:Linuxの真骨頂!コマンド同士を連携させる技術
- テキスト処理の基本:cat, head, tail, less…ファイルの中身を覗く道具たち
- 最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
- 【今回】シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
- 条件分岐(if文):サーバーの状態を見て「判断」できるスクリプトを作る
- 繰り返し処理(for/while文):面倒な単純作業を1秒で終わらせるループ処理
- テキスト処理の応用:grep, sed, awk…ログ解析の達人になるための三種の神器
- 実践・自動化スクリプト:バックアップと監視を自動化し、Cronで定期実行する
- 総仕上げ:自作スクリプトの集大成と、エンジニアとしての歩き方
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
動いた! echo と date が一気に実行されました!
これがプログラミングの第一歩なんですね!
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



コメント