コマンドを毎回手で打つ代わりに、複数のコマンドをファイルにまとめて実行できます。 これがシェルスクリプトです。定型作業の自動化やバッチ処理に欠かせないスキルです。
スクリプトファイルを作る
シェルスクリプトは通常 .sh という拡張子を付けたテキストファイルです。
ファイルの先頭行に shebang と呼ばれる #!/bin/bash を書くことで、
このファイルを Bash で実行するよう OS に伝えます。
#!/bin/bash
echo "Hello, Linux!"
ファイルを保存したら実行権限を付与し、スクリプトを実行します。
chmod +x hello.sh
./hello.sh
Hello, Linux!
変数を使う
変数に値を代入するときは = の前後にスペースを入れません。
値を参照するときは変数名の前に $ を付けます。
#!/bin/bash
name="taro"
echo "こんにちは、${name}さん!"
こんにちは、taroさん!
$nameと${name}はどちらも同じですが、文字列の中で変数を展開するときは${}で囲む方がミスを防げます。
コマンドの結果を変数に入れる
$() を使うとコマンドの出力を変数に代入できます。
#!/bin/bash
today=$(date +%Y-%m-%d)
echo "今日は ${today} です"
今日は 2026-06-28 です
条件分岐(if 文)
if を使うと条件によって処理を切り替えられます。
#!/bin/bash
score=75
if [ $score -ge 60 ]; then
echo "合格です"
else
echo "不合格です"
fi
合格です
比較演算子の一覧です。
| 演算子 | 意味 |
|---|---|
-eq | 等しい (==) |
-ne | 等しくない (!=) |
-lt | より小さい (<) |
-le | 以下 (<=) |
-gt | より大きい (>) |
-ge | 以上 (>=) |
文字列の比較には = と != を使います。
#!/bin/bash
os="Linux"
if [ "$os" = "Linux" ]; then
echo "Linuxを使っています"
fi
ループ(for 文)
for を使うと繰り返し処理を書けます。
リストのループ
#!/bin/bash
for fruit in apple banana cherry; do
echo "フルーツ: ${fruit}"
done
フルーツ: apple
フルーツ: banana
フルーツ: cherry
数値のループ
seq コマンドや {開始..終了} の記法で数値の連番を扱えます。
#!/bin/bash
for i in {1..5}; do
echo "${i} 回目"
done
1 回目
2 回目
3 回目
4 回目
5 回目
ファイルに対するループ
カレントディレクトリの .txt ファイルすべてに対して処理する例です。
#!/bin/bash
for file in *.txt; do
echo "処理中: ${file}"
done
while ループ
条件が真の間、繰り返します。
#!/bin/bash
count=1
while [ $count -le 3 ]; do
echo "カウント: ${count}"
count=$((count + 1))
done
カウント: 1
カウント: 2
カウント: 3
$((式)) は算術演算に使う記法です。
コマンドライン引数を受け取る
スクリプトに引数を渡すと、$1、$2 … で受け取れます。
$0 はスクリプト自身のファイル名、$# は引数の個数です。
#!/bin/bash
echo "スクリプト名: $0"
echo "引数1: $1"
echo "引数2: $2"
echo "引数の数: $#"
./args.sh foo bar
スクリプト名: ./args.sh
引数1: foo
引数2: bar
引数の数: 2
練習問題
問題 1
/tmp 以下に practice1.sh というスクリプトを作成してください。
スクリプトは次の動作をすること。
- 変数
userに自分のユーザー名(whoamiの出力)を代入する こんにちは、<user名>さん。今日は <今日の日付> です。と表示する
ヒント: $(whoami) と $(date +%Y-%m-%d) を使います。
解答を見る
#!/bin/bash
user=$(whoami)
today=$(date +%Y-%m-%d)
echo "こんにちは、${user}さん。今日は ${today} です。"実行方法:
chmod +x /tmp/practice1.sh
/tmp/practice1.sh問題 2
引数として渡された数値が 偶数か奇数か を判定して表示するスクリプト even_odd.sh を作成してください。
実行例:
./even_odd.sh 4
# → 4 は偶数です
./even_odd.sh 7
# → 7 は奇数です
ヒント: 数値を 2 で割った余りは $((n % 2)) で求められます。
解答を見る
#!/bin/bash
n=$1
if [ $((n % 2)) -eq 0 ]; then
echo "${n} は偶数です"
else
echo "${n} は奇数です"
fi問題 3
カレントディレクトリにある .log ファイルの一覧を表示し、それぞれのファイルの行数を wc -l で数えて出力するスクリプトを作成してください。
実行例:
access.log: 120 行
error.log: 34 行
解答を見る
#!/bin/bash
for file in *.log; do
lines=$(wc -l < "$file")
echo "${file}: ${lines} 行"
donewc -l < "$file" とすることでファイル名が余分に表示されるのを防いでいます。