Shell Script チートシート:変数・配列・連想配列・算術展開を一枚で把握
Shell Script を書く際、「変数の展開方法ってどうだっけ?」「配列の要素取得はどう書くんだっけ?」と毎回調べていませんか。
本記事では、Shell Script における変数、配列、連想配列、算術展開の基本から応用までを、すぐに参照できるチートシート形式でまとめました。これ一枚で、日常的に使う記法をサッと確認できますよ。
早見表
まずは全体像を把握できるよう、各機能の主要な記法を表形式で整理します。
変数操作 早見表
| # | 記法 | 説明 | 使用例 |
|---|---|---|---|
| 1 | 変数名=値 | 変数への代入(=の前後にスペース不可) | name="Alice" |
| 2 | $変数名 または ${変数名} | 変数の展開 | echo $name |
| 3 | ${変数名:-デフォルト値} | 変数が未設定または空なら代替値を使用 | ${user:-guest} |
| 4 | ${変数名:=デフォルト値} | 変数が未設定または空なら代入&使用 | ${count:=0} |
| 5 | ${変数名:?エラーメッセージ} | 変数が未設定または空ならエラー終了 | ${file:?ファイル未指定} |
| 6 | ${変数名:+代替値} | 変数が設定されていれば代替値を使用 | ${debug:+--verbose} |
| 7 | ${#変数名} | 文字列の長さを取得 | ${#name} |
| 8 | ${変数名:開始位置:長さ} | 部分文字列の取得 | ${path:0:5} |
| 9 | ${変数名#パターン} | 前方最短マッチで削除 | ${file#*/} |
| 10 | ${変数名##パターン} | 前方最長マッチで削除 | ${file##*/} |
| 11 | ${変数名%パターン} | 後方最短マッチで削除 | ${file%.*} |
| 12 | ${変数名%%パターン} | 後方最長マッチで削除 | ${file%%.*} |
| 13 | ${変数名/パターン/置換文字列} | 最初にマッチした部分を置換 | ${text/old/new} |
| 14 | ${変数名//パターン/置換文字列} | マッチした全ての部分を置換 | ${text//old/new} |
配列操作 早見表
| # | 記法 | 説明 | 使用例 |
|---|---|---|---|
| 1 | 配列名=(要素1 要素2 ...) | 配列の初期化 | arr=(apple banana cherry) |
| 2 | ${配列名[インデックス]} | 特定要素へのアクセス | ${arr[0]} |
| 3 | ${配列名[@]} または ${配列名[*]} | 全要素の展開 | ${arr[@]} |
| 4 | ${#配列名[@]} | 配列の要素数を取得 | ${#arr[@]} |
| 5 | 配列名+=(要素) | 配列に要素を追加 | arr+=(date) |
| 6 | 配列名[インデックス]=値 | 特定インデックスに代入 | arr[1]=orange |
| 7 | ${配列名[@]:開始:個数} | 部分配列の取得 | ${arr[@]:1:2} |
| 8 | unset 配列名[インデックス] | 特定要素の削除 | unset arr[2] |
連想配列操作 早見表
| # | 記法 | 説明 | 使用例 |
|---|---|---|---|
| 1 | declare -A 配列名 | 連想配列の宣言 | declare -A colors |
| 2 | 配列名[キー]=値 | キーと値の設定 | colors[apple]=red |
| 3 | ${配列名[キー]} | 値の取得 | ${colors[apple]} |
| 4 | ${配列名[@]} | 全ての値を展開 | ${colors[@]} |
| 5 | ${!配列名[@]} | 全てのキーを展開 | ${!colors[@]} |
| 6 | ${#配列名[@]} | 要素数の取得 | ${#colors[@]} |
| 7 | unset 配列名[キー] | 特定キーの削除 | unset colors[banana] |
算術展開 早見表
| # | 記法 | 説明 | 使用例 |
| --- | --------------------------- | ------------------------------ | ----------------------- | ------------ | -------------------- |
| 1 | $((式)) | 算術式の評価と展開 | echo $((5 + 3)) |
| 2 | ((式)) | 算術式の評価(終了ステータス) | ((count++)) |
| 3 | let "式" | 算術式の評価 | let "result = 10 * 2" |
| 4 | + - * / % | 四則演算・剰余 | $((10 % 3)) |
| 5 | ** | べき乗 | $((2 ** 8)) |
| 6 | ++ -- | インクリメント・デクリメント | ((i++)) |
| 7 | += -= *= /= %= | 複合代入演算子 | ((sum += 5)) |
| 8 | == != < > <= >= | 比較演算子 | ((a > b)) |
| 9 | && | | ! | 論理演算子 | ((a > 0 && b > 0)) |
| 10 | & | ^ ~ | ビット演算子 | $((5 & 3)) |
| 11 | << >> | ビットシフト | $((8 >> 2)) |
背景
Shell Script における変数と配列の重要性
Shell Script は Linux や macOS などの Unix 系 OS で広く使われる自動化ツールです。サーバー管理、バッチ処理、CI/CD パイプラインなど、さまざまな場面で活躍していますね。
これらのタスクでは、設定情報の保持、複数のデータの管理、計算処理などが頻繁に発生します。そこで欠かせないのが変数、配列、連想配列、算術展開といった基本機能です。
しかし、Shell Script の記法は独特で、他のプログラミング言語とは異なる点も多く、「どう書けばいいんだっけ?」と迷うことがありませんか。
Shell Script の特徴的な記法
Shell Script では、以下のような特徴があります。
- スペースに敏感: 代入時に
=の前後にスペースを入れると構文エラーになる - 展開記法が豊富:
$変数だけでなく、${変数}の中でさまざまな操作ができる - 型がゆるい: 基本的に文字列として扱われ、必要に応じて数値として解釈される
- 配列の種類: 通常の配列(インデックス配列)と連想配列(Bash 4.0 以降)がある
以下の図は、Shell Script における主要なデータ構造とその操作方法の全体像を示します。
mermaidflowchart TD
start["Shell Scriptの<br/>データ操作"] --> var["変数"]
start --> arr["配列"]
start --> assoc["連想配列"]
start --> calc["算術展開"]
var --> var_basic["基本操作<br/>(代入・展開)"]
var --> var_adv["高度な操作<br/>(デフォルト値・文字列操作)"]
arr --> arr_basic["基本操作<br/>(初期化・アクセス)"]
arr --> arr_loop["ループ処理"]
assoc --> assoc_declare["宣言<br/>(declare -A)"]
assoc --> assoc_ops["キー・値の操作"]
calc --> calc_basic["基本演算<br/>(四則演算)"]
calc --> calc_adv["高度な演算<br/>(ビット・論理)"]
このように、Shell Script では用途に応じて適切なデータ構造を選び、それぞれの記法を理解する必要があるのです。
課題
よくある困りごと
Shell Script を書く際、以下のような課題に直面することが多いでしょう。
- 記法を忘れてしまう:
$変数と${変数}の使い分け、配列の展開方法など、細かい記法を覚えきれない - エラーの原因がわかりにくい: スペースの有無、クォートの使い方など、些細なミスでエラーが発生する
- ドキュメントが分散している: man ページ、Web の記事など、情報が散在していて探しにくい
- 応用的な操作方法がわからない: 文字列の一部を取得したい、配列の一部だけ処理したいなど、やりたいことに対する記法がすぐに見つからない
特に、以下のようなケースでつまずきやすいですね。
bash# よくあるエラー例1: スペースがあるとコマンドとして解釈される
name = "Alice" # NG: nameコマンドを=という引数で実行しようとする
# よくあるエラー例2: クォートがないと展開が意図通りにならない
files=($(ls)) # ファイル名にスペースがあると分割される
# よくあるエラー例3: 連想配列を宣言せずに使う
colors[red]=apple # Bash 4.0以降でもdeclare -Aが必要
これらのエラーは、記法の理解不足や、細かいルールの見落としによって発生します。
エラー情報と解決の難しさ
Shell Script のエラーメッセージは、時に抽象的でわかりにくいことがあります。
エラーコード例: Exit Code 1、Exit Code 2(一般的なエラー)
エラーメッセージ例:
bashbash: name: command not found
# 原因: 代入時に = の前後にスペースがある
bash: ${colors[red]}: bad substitution
# 原因: 連想配列を declare -A で宣言していない
bash: syntax error near unexpected token `)'
# 原因: クォートや括弧の対応が正しくない
発生条件:
- 変数代入時にスペースを入れた
- 連想配列を宣言せずに使用した
- 配列の展開時にクォートを忘れた
解決方法:
- 変数代入時は
=の前後にスペースを入れない - 連想配列を使う前に必ず
declare -Aで宣言する - 配列を展開する際は
"${array[@]}"のようにダブルクォートで囲む - エラーメッセージの行番号を確認し、前後の記法をチェックする
このように、エラーの原因を特定するには、Shell Script 特有の記法ルールを理解しておく必要があります。
解決策
チートシート形式でまとめる意義
これらの課題を解決するには、すぐに参照できるチートシートが最適です。記事冒頭の早見表と、以下の詳細な解説を組み合わせることで、必要な記法を素早く見つけられるようになりますよ。
ここでは、変数・配列・連想配列・算術展開それぞれについて、基本から応用まで段階的に説明します。
変数の基本操作
Shell Script における変数操作の基本フローを図で示します。
mermaidflowchart LR
assign["変数代入<br/>name=Alice"] --> expand["変数展開<br/>$name または ${name}"]
expand --> default_ops["デフォルト値操作<br/>${name:-default}"]
expand --> string_ops["文字列操作<br/>${#name}, ${name:0:3}"]
expand --> pattern_ops["パターン操作<br/>${name#pattern}"]
変数は Shell Script の最も基本的なデータ構造です。代入と展開の方法を押さえましょう。
基本的な代入と展開
変数への代入は 変数名=値 の形式で行います。この際、= の前後にスペースを入れてはいけません。
bash# 変数の代入
name="Alice"
age=25
変数の値を使用するには、$変数名 または ${変数名} で展開します。
bash# 変数の展開
echo $name # "Alice" と表示
echo ${name} # "Alice" と表示(推奨形式)
${変数名} の形式を使うと、変数名の境界が明確になり、文字列と連結する際にも安全です。
bash# 文字列との連結
filename="data"
echo ${filename}_backup.txt # "data_backup.txt" と表示
echo $filename_backup.txt # 変数名が filename_backup と解釈されエラーになる
デフォルト値の設定
変数が未設定の場合に備えて、デフォルト値を指定する記法が用意されています。
bash# 変数が未設定または空の場合、デフォルト値を使用
echo ${user:-guest} # userが未設定なら "guest" と表示
# 変数が未設定または空の場合、デフォルト値を代入して使用
echo ${count:=0} # countが未設定なら 0 を代入し、"0" と表示
# 変数が未設定または空の場合、エラーメッセージを表示して終了
echo ${file:?ファイル名が指定されていません}
# 変数が設定されている場合のみ、代替値を使用
echo ${debug:+--verbose} # debugが設定されていれば "--verbose" と表示
これらの記法は、スクリプトの柔軟性と堅牢性を高めるために非常に有効です。
文字列の長さと部分文字列
変数に格納された文字列の長さを取得したり、一部を切り出したりできます。
bash# 文字列の長さを取得
text="Hello, World!"
echo ${#text} # "13" と表示
部分文字列は、開始位置とオプションで長さを指定して取得します(開始位置は 0 から始まる)。
bash# 部分文字列の取得
path="/usr/local/bin"
echo ${path:0:4} # "/usr" と表示(0番目から4文字)
echo ${path:5} # "local/bin" と表示(5番目から最後まで)
echo ${path:5:5} # "local" と表示(5番目から5文字)
パターンマッチによる削除と置換
変数の値から特定のパターンにマッチする部分を削除したり、置換したりできます。
bash# 前方からの最短マッチで削除(#)
filename="dir1/dir2/file.txt"
echo ${filename#*/} # "dir2/file.txt" と表示(最初の */ を削除)
# 前方からの最長マッチで削除(##)
echo ${filename##*/} # "file.txt" と表示(最後の / まで削除)
bash# 後方からの最短マッチで削除(%)
filename="archive.tar.gz"
echo ${filename%.*} # "archive.tar" と表示(最後の .* を削除)
# 後方からの最長マッチで削除(%%)
echo ${filename%%.*} # "archive" と表示(最初の . まで削除)
bash# パターンの置換
text="Hello World"
echo ${text/World/Bash} # "Hello Bash" と表示(最初のマッチを置換)
text="apple apple banana"
echo ${text/apple/orange} # "orange apple banana" と表示
echo ${text//apple/orange} # "orange orange banana" と表示(全てのマッチを置換)
配列の操作
配列は複数の値を順序付きで管理できるデータ構造です。
配列の初期化とアクセス
配列は丸括弧で囲み、スペース区切りで要素を指定して初期化します。
bash# 配列の初期化
fruits=(apple banana cherry date)
個々の要素にアクセスするには、インデックス(0 から始まる)を指定します。
bash# 要素へのアクセス
echo ${fruits[0]} # "apple" と表示
echo ${fruits[2]} # "cherry" と表示
全要素を展開するには [@] または [*] を使用します。
bash# 全要素の展開
echo ${fruits[@]} # "apple banana cherry date" と表示
echo ${fruits[*]} # 同上(ダブルクォート内での挙動が異なる)
ダブルクォートで囲んだ場合の違いに注意しましょう。
bash# ダブルクォートで囲んだ場合の違い
for item in "${fruits[@]}"; do
echo "$item" # 各要素が個別に展開される
done
for item in "${fruits[*]}"; do
echo "$item" # 全要素が1つの文字列として展開される
done
通常は "${配列[@]}" を使うことが推奨されます。
配列の要素数と追加
配列の要素数を取得するには ${#配列名[@]} を使います。
bash# 要素数の取得
echo ${#fruits[@]} # "4" と表示
配列に要素を追加するには += 演算子を使用します。
bash# 要素の追加
fruits+=(elderberry)
echo ${#fruits[@]} # "5" と表示
echo ${fruits[4]} # "elderberry" と表示
特定のインデックスに値を代入することもできます。
bash# 特定インデックスへの代入
fruits[1]="blueberry"
echo ${fruits[1]} # "blueberry" と表示
部分配列の取得と要素の削除
配列の一部だけを取得するには、開始インデックスと個数を指定します。
bash# 部分配列の取得
numbers=(1 2 3 4 5 6 7 8 9 10)
echo ${numbers[@]:2:3} # "3 4 5" と表示(インデックス2から3個)
echo ${numbers[@]:5} # "6 7 8 9 10" と表示(インデックス5から最後まで)
特定の要素を削除するには unset コマンドを使用します。
bash# 要素の削除
unset fruits[2]
echo ${fruits[@]} # "apple blueberry date elderberry" と表示(cherryが削除)
削除後もインデックスは詰められないため、要素数とインデックスの関係に注意が必要です。
連想配列の操作
連想配列(ハッシュ、辞書とも呼ばれる)は、キーと値のペアでデータを管理します。Bash 4.0 以降で使用可能です。
連想配列の宣言と使用
連想配列を使用する前に、必ず declare -A で宣言する必要があります。
bash# 連想配列の宣言
declare -A colors
宣言後、キーを指定して値を設定します。
bash# キーと値の設定
colors[apple]="red"
colors[banana]="yellow"
colors[grape]="purple"
値の取得はインデックス配列と同じ記法です。
bash# 値の取得
echo ${colors[apple]} # "red" と表示
echo ${colors[banana]} # "yellow" と表示
キーと値の一覧取得
全ての値を取得するには [@] を使用します。
bash# 全ての値を取得
echo ${colors[@]} # "red yellow purple" と表示(順序は不定)
全てのキーを取得するには ${!配列名[@]} を使います。
bash# 全てのキーを取得
echo ${!colors[@]} # "apple banana grape" と表示(順序は不定)
要素数の取得方法はインデックス配列と同じです。
bash# 要素数の取得
echo ${#colors[@]} # "3" と表示
キーと値のループ処理
連想配列のキーと値をループで処理する例を示します。
bash# キーを使ったループ
for key in "${!colors[@]}"; do
echo "Key: $key, Value: ${colors[$key]}"
done
# 出力例:
# Key: apple, Value: red
# Key: banana, Value: yellow
# Key: grape, Value: purple
特定のキーを削除するには unset を使用します。
bash# 要素の削除
unset colors[banana]
echo ${#colors[@]} # "2" と表示
算術展開
Shell Script では文字列が基本ですが、算術演算を行うための記法が用意されています。
基本的な算術演算
算術式を評価して結果を展開するには $(( 式 )) を使用します。
bash# 四則演算
echo $((5 + 3)) # "8" と表示
echo $((10 - 4)) # "6" と表示
echo $((6 * 7)) # "42" と表示
echo $((20 / 4)) # "5" と表示
echo $((10 % 3)) # "1" と表示(剰余)
べき乗の計算も可能です。
bash# べき乗
echo $((2 ** 8)) # "256" と表示(2の8乗)
変数を使った計算も直感的に書けます。
bash# 変数を使った計算
a=10
b=20
result=$((a + b))
echo $result # "30" と表示
インクリメント・デクリメントと複合代入
変数の値を増減させるには、インクリメント・デクリメント演算子が便利です。
bash# インクリメント・デクリメント
count=0
((count++)) # countを1増やす
echo $count # "1" と表示
((count--)) # countを1減らす
echo $count # "0" と表示
前置・後置の違いにも注意しましょう。
bash# 前置と後置の違い
i=5
echo $((i++)) # "5" と表示(評価後にインクリメント)
echo $i # "6" と表示
j=5
echo $((++j)) # "6" と表示(インクリメント後に評価)
echo $j # "6" と表示
複合代入演算子を使うと、計算と代入を同時に行えます。
bash# 複合代入演算子
sum=10
((sum += 5)) # sum = sum + 5 と同じ
echo $sum # "15" と表示
total=100
((total -= 20)) # total = total - 20 と同じ
echo $total # "80" と表示
value=3
((value *= 4)) # value = value * 4 と同じ
echo $value # "12" と表示
比較演算と論理演算
算術式の中で比較演算を行い、結果を真(1)または偽(0)として取得できます。
bash# 比較演算
echo $((5 > 3)) # "1" と表示(真)
echo $((5 < 3)) # "0" と表示(偽)
echo $((5 == 5)) # "1" と表示(真)
echo $((5 != 3)) # "1" と表示(真)
(( 式 )) の形式では、結果が 0 なら終了ステータスが偽、0 以外なら真となります。
bash# 条件分岐での使用
a=10
if ((a > 5)); then
echo "aは5より大きい"
fi
論理演算子を使って複数の条件を組み合わせられます。
bash# 論理演算
a=10
b=20
if ((a > 0 && b > 0)); then
echo "どちらも正の数"
fi
c=0
if ((c == 0 || c > 100)); then
echo "cは0または100より大きい"
fi
ビット演算とシフト演算
ビットレベルの操作も算術展開で行えます。
bash# ビット演算
echo $((5 & 3)) # "1" と表示(ビットAND: 0101 & 0011 = 0001)
echo $((5 | 3)) # "7" と表示(ビットOR: 0101 | 0011 = 0111)
echo $((5 ^ 3)) # "6" と表示(ビットXOR: 0101 ^ 0011 = 0110)
echo $((~5)) # "-6" と表示(ビットNOT: 符号付き整数として反転)
ビットシフト演算も利用できます。
bash# ビットシフト
echo $((8 << 2)) # "32" と表示(左シフト: 1000 -> 100000)
echo $((8 >> 2)) # "2" と表示(右シフト: 1000 -> 0010)
これらの演算は、フラグ管理やパフォーマンスが重要な場面で役立ちます。
let コマンドによる算術評価
let コマンドも算術式を評価できますが、$(( )) や (( )) の方が一般的です。
bash# letコマンドの使用例
let result=10*5
echo $result # "50" と表示
let "x = 3 + 4"
echo $x # "7" と表示
可読性の観点から、$(( )) や (( )) の使用が推奨されます。
具体例
ここまでの知識を活用した実践的なスクリプト例をいくつか紹介します。
具体例 1: ファイル名の一括変更
拡張子を .txt から .md に変更するスクリプトです。
bash#!/bin/bash
# カレントディレクトリの .txt ファイルを取得
files=(*.txt)
# 変更前の確認
echo "以下のファイルを変更します:"
echo "変更対象: ${#files[@]} 個"
ファイル数を確認した後、ループで処理します。
bash# ファイル名の変更処理
for file in "${files[@]}"; do
# 拡張子を除いたベース名を取得
basename="${file%.txt}"
# 新しいファイル名を生成
newname="${basename}.md"
echo "変更: $file -> $newname"
mv "$file" "$newname"
done
echo "処理完了"
このスクリプトでは、${file%.txt} で拡張子を削除し、新しい拡張子を付けています。
具体例 2: ログファイルの統計情報取得
ログファイルから特定のキーワードを集計するスクリプトです。
bash#!/bin/bash
# ログファイルのパス
logfile="${1:-/var/log/app.log}"
# ファイルの存在確認
if [[ ! -f "$logfile" ]]; then
echo "エラー: ファイル $logfile が見つかりません" >&2
exit 1
fi
連想配列を使って、ログレベルごとの出現回数を集計します。
bash# 連想配列の宣言
declare -A log_levels
# ログファイルを読み込んで集計
while IFS= read -r line; do
# ログレベルを抽出(例: [INFO], [ERROR] など)
if [[ $line =~ \[([A-Z]+)\] ]]; then
level="${BASH_REMATCH[1]}"
((log_levels[$level]++))
fi
done < "$logfile"
集計結果を表示します。
bash# 結果の表示
echo "=== ログレベル別統計 ==="
for level in "${!log_levels[@]}"; do
count="${log_levels[$level]}"
echo "$level: $count 件"
done
このスクリプトでは、正規表現マッチングと連想配列を組み合わせて効率的に集計しています。
具体例 3: バックアップスクリプト
日付をファイル名に含めたバックアップを作成するスクリプトです。
bash#!/bin/bash
# バックアップ対象とバックアップ先のディレクトリ
source_dir="${1:?バックアップ元ディレクトリを指定してください}"
backup_dir="${2:-/backup}"
# バックアップ先ディレクトリの作成
mkdir -p "$backup_dir"
# 現在の日時を取得
timestamp=$(date +"%Y%m%d_%H%M%S")
ファイル名を生成し、圧縮してバックアップします。
bash# バックアップファイル名の生成
source_basename=$(basename "$source_dir")
backup_file="${backup_dir}/${source_basename}_${timestamp}.tar.gz"
# バックアップの実行
echo "バックアップ中: $source_dir -> $backup_file"
tar -czf "$backup_file" -C "$(dirname "$source_dir")" "$(basename "$source_dir")"
# 結果の確認
if [[ $? -eq 0 ]]; then
echo "バックアップ完了"
# ファイルサイズの表示
filesize=$(stat -f%z "$backup_file" 2>/dev/null || stat -c%s "$backup_file" 2>/dev/null)
filesize_mb=$((filesize / 1024 / 1024))
echo "ファイルサイズ: ${filesize_mb} MB"
else
echo "エラー: バックアップに失敗しました" >&2
exit 1
fi
算術展開を使ってファイルサイズを MB 単位で表示しています。
具体例 4: 配列を使った複数サーバーへの一括処理
複数のサーバーに対して同じコマンドを実行するスクリプトです。
bash#!/bin/bash
# サーバーリストを配列で定義
servers=(
"server1.example.com"
"server2.example.com"
"server3.example.com"
)
# 実行するコマンド
command="${1:-uptime}"
echo "=== ${#servers[@]} 台のサーバーに対して実行 ==="
各サーバーに順次接続してコマンドを実行します。
bash# サーバーごとにコマンド実行
success_count=0
fail_count=0
for server in "${servers[@]}"; do
echo "--- $server ---"
# SSHでコマンド実行
if ssh -o ConnectTimeout=5 "$server" "$command"; then
((success_count++))
else
echo "エラー: $server への接続に失敗" >&2
((fail_count++))
fi
echo ""
done
最後に実行結果のサマリーを表示します。
bash# 実行結果のサマリー
echo "=== 実行結果 ==="
echo "成功: $success_count 台"
echo "失敗: $fail_count 台"
echo "合計: ${#servers[@]} 台"
配列とインクリメント演算を組み合わせて、わかりやすく統計情報を表示しています。
具体例 5: 設定ファイルの読み込みと検証
INI 形式風の設定ファイルを読み込み、連想配列に格納するスクリプトです。
bash#!/bin/bash
# 設定ファイルのパス
config_file="${1:-config.ini}"
# 連想配列の宣言
declare -A config
# 必須項目の定義
required_keys=("database_host" "database_port" "database_name")
設定ファイルを 1 行ずつ読み込んで解析します。
bash# 設定ファイルの読み込み
while IFS='=' read -r key value; do
# コメント行と空行をスキップ
[[ "$key" =~ ^#.*$ || -z "$key" ]] && continue
# 前後の空白を削除
key=$(echo "$key" | xargs)
value=$(echo "$value" | xargs)
# 連想配列に格納
config[$key]="$value"
done < "$config_file"
必須項目の検証を行います。
bash# 必須項目の検証
missing_keys=()
for key in "${required_keys[@]}"; do
if [[ -z "${config[$key]}" ]]; then
missing_keys+=("$key")
fi
done
# エラーチェック
if ((${#missing_keys[@]} > 0)); then
echo "エラー: 以下の必須項目が設定されていません:" >&2
printf " - %s\n" "${missing_keys[@]}" >&2
exit 1
fi
echo "設定ファイルの検証完了"
echo "読み込まれた設定項目: ${#config[@]} 個"
このスクリプトでは、連想配列と配列を組み合わせて、柔軟な設定管理を実現しています。
まとめ
本記事では、Shell Script における変数、配列、連想配列、算術展開の基本から応用までをチートシート形式でまとめました。
記事冒頭の早見表を活用すれば、必要な記法をすぐに見つけられますね。また、具体例を参考にすることで、実践的なスクリプト作成にも役立てられるでしょう。
Shell Script の記法は独特ですが、一度整理して理解すれば、自動化タスクやサーバー管理で大きな力を発揮します。
ぜひこのチートシートをブックマークして、日々のスクリプト作成にお役立てください。
関連リンク
articleShell Script チートシート:変数・配列・連想配列・算術展開を一枚で把握
articleShell Script 開発環境の作り方:Homebrew・エディタ・シェル選定・PATH 設計
articleShell Script とは?初心者が最短で理解する基本構文・実行モデル・活用領域
article【まとめ】よく使用するものだけを抜粋したUnixコマンドとVimコマンドの一覧まとめ
articlePlaywright Debug モード活用:テストが落ちる原因を 5 分で特定する手順
articleVue.js でメモリリーク?watch/effect/イベント登録の落とし穴と検知法
articleTailwind CSS のクラスが消える/縮む原因を特定:ツリーシェイクと safelist 完全対策
articlePHP 構文チートシート:配列・クロージャ・型宣言・match を一枚で把握
articleSvelte ストアエラー「store is not a function」を解決:writable/derived の落とし穴
articleNext.js の 観測可能性入門:OpenTelemetry/Sentry/Vercel Analytics 連携
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来