シェルスクリプト 初級

シェルスクリプト基礎

Bashシェルスクリプトの基本構文を学ぶ。変数・条件分岐・ループを使って繰り返し作業を自動化する方法を解説する

コマンドを毎回手で打つ代わりに、複数のコマンドをファイルにまとめて実行できます。 これがシェルスクリプトです。定型作業の自動化やバッチ処理に欠かせないスキルです。

スクリプトファイルを作る

シェルスクリプトは通常 .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} 行"
done

wc -l < "$file" とすることでファイル名が余分に表示されるのを防いでいます。