シェルスクリプトとは?
シェル
シェル(Shell) は、私たちがコンピュータとやり取りするためのインターフェースです。具体的には、コマンドを入力して実行する黒い画面(ターミナル)で使っているのがシェルです。
よく使われるシェルには以下のようなものがあります:
- Bash (Bourne Again Shell) - 最も一般的
- Zsh (Z Shell) - macOSのデフォルト
- Fish (Friendly Interactive Shell) - 初心者に優しい
シェルスクリプトの正体
シェルスクリプトは、シェルで実行するコマンドをファイルにまとめて書いたものです。
複雑な作業をの自動化や簡略化ができます。
基本的な書き方
シバン(Shebang)
ファイルの最初の行にはシバンを書きます。これは「どのシェルで実行するか」を指定するものです。
コメントのように見えますが、どのシェルスクリプトにも書かれている大切なものです。
sample.sh
#!/bin/bash
実際のスクリプトを書く
sample.sh
#!/bin/bash
echo "Hello, World!"
echo "今日の日付: $(date)"
echo "現在のディレクトリ: $(pwd)"
実行
terminal
./sample.sh
変数の使い方
変数の定義と使用
variables.sh
#!/bin/bash
# 変数の定義(=の前後にスペースを入れない!)
NAME="太郎"
AGE=25
# 変数の使用
echo "こんにちは、${NAME}さん!"
echo "年齢は${AGE}歳ですね。"
環境変数
システムに設定されている環境変数も使えます:
env_variables.sh
#!/bin/bash
echo "ユーザー名: $USER"
echo "ホームディレクトリ: $HOME"
echo "現在のパス: $PATH"
コマンドの結果を変数に格納
command_substitution.sh
#!/bin/bash
# コマンドの実行結果を変数に格納
CURRENT_DATE=$(date +%Y-%m-%d)
FILE_COUNT=$(ls -1 | wc -l)
echo "今日は${CURRENT_DATE}です"
echo "このディレクトリには${FILE_COUNT}個のファイルがあります"
条件分岐(if文)
基本的なif文
age_check.sh
#!/bin/bash
AGE=20
if [ $AGE -ge 18 ]; then
echo "成人です"
else
echo "未成年です"
fi
ファイルの存在確認
file_check.sh
#!/bin/bash
FILENAME="test.txt"
if [ -f "$FILENAME" ]; then
echo "$FILENAME は存在します"
else
echo "$FILENAME は存在しません"
fi
繰り返し処理(ループ)
for文
for_loop.sh
#!/bin/bash
# 1から5まで繰り返し
for i in {1..5}; do
echo "回数: $i"
done
# ファイルに対する繰り返し
for FILE in *.txt; do
echo "処理中: $FILE"
# ここでファイルに対する処理を書く
done
while文
while_loop.sh
#!/bin/bash
COUNT=1
while [ $COUNT -le 5 ]; do
echo "カウント: $COUNT"
COUNT=$((COUNT + 1))
done
エラーハンドリング
error_handling.sh
#!/bin/bash
# エラーが発生したら即座に終了
set -e
# 未定義の変数使用でエラー
set -u
# パイプ処理でのエラーも検知
set -o pipefail
echo "安全なスクリプトの実行中..."
# コマンドの実行結果をチェック
if ! cp source.txt destination.txt; then
echo "ファイルのコピーに失敗しました"
exit 1
fi
echo "処理が正常に完了しました"
よく使うテクニック
1. 対話的な入力
interactive_input.sh
#!/bin/bash
read -p "お名前を入力してください: " NAME
echo "こんにちは、${NAME}さん!"
2. 色付きの出力
color_output.sh
#!/bin/bash
# 色の定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
echo "${RED}赤"
echo "${GREEN}緑"
echo "${YELLOW}黄色"