はじめに

こんにちは!今回はdeclareコマンドについて解説します。

declareは、シェル変数に型や属性を設定できるコマンドです。普通の変数より高度なことができるので、シェルスクリプトを書く時に知ってると便利です。

declareコマンドとは

declareは、変数の属性を指定して宣言するための組み込みコマンドです。

普通に変数を作ると文字列として扱われますが、declareを使うと整数型にしたり、読み取り専用にしたり、配列にしたりできます。ちょっと高度な変数管理ができるわけです。

基本構文

1
declare [オプション] 変数名=

主なオプション

オプション 説明
-i 整数型として宣言
-r 読み取り専用(定数)として宣言
-a 配列として宣言
-A 連想配列として宣言
-x 環境変数として宣言(exportと同じ)
-p 変数の属性と値を表示
-l 小文字に変換
-u 大文字に変換

使用例

例1: 整数型変数を宣言

1
2
declare -i num=10
echo $num

実行結果:

1
10

整数型として宣言すると、算術演算が自動で行われます。

1
2
3
declare -i num=10
num=num+5
echo $num

実行結果:

1
15

普通の変数だとnum=num+5は文字列になりますが、整数型なら計算してくれます。

例2: 読み取り専用変数(定数)を宣言

1
2
3
declare -r PI=3.14159
echo $PI
PI=3.14  # エラーになる

実行結果:

1
2
3.14159
bash: PI: 読み取り専用変数です

一度設定したら変更できない定数を作れます。

例3: 配列を宣言

1
2
3
4
declare -a fruits=("apple" "banana" "orange")
echo ${fruits[0]}
echo ${fruits[1]}
echo ${fruits[@]}  # すべての要素

実行結果:

1
2
3
apple
banana
apple banana orange

配列を使うと複数の値を1つの変数で管理できます。

例4: 連想配列を宣言

1
2
3
4
5
6
7
declare -A user
user[name]="Taro"
user[age]=25
user[city]="Tokyo"

echo ${user[name]}
echo ${user[age]}

実行結果:

1
2
Taro
25

連想配列は、インデックスの代わりに任意の文字列をキーとして使えます。便利です。

例5: 環境変数として宣言

1
2
declare -x MY_VAR="hello"
# exportと同じ効果

子プロセスでも使える環境変数になります。

例6: 変数の属性を確認

1
2
3
4
declare -i num=10
declare -r PI=3.14
declare -p num
declare -p PI

実行結果:

1
2
declare -i num="10"
declare -r PI="3.14"

-pオプションで、変数にどんな属性が付いてるか確認できます。

例7: 大文字・小文字変換

1
2
3
4
5
declare -u upper="hello"
echo $upper

declare -l lower="WORLD"
echo $lower

実行結果:

1
2
HELLO
world

-uで大文字に、-lで小文字に自動変換されます。

例8: すべての変数を表示

1
declare

現在宣言されているすべての変数とその値が表示されます。結構な量が出るので注意。

配列の操作

配列の基本操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 配列の宣言と初期化
declare -a colors=("red" "green" "blue")

# 要素の追加
colors+=("yellow")

# 要素の参照
echo ${colors[0]}        # 最初の要素
echo ${colors[@]}        # すべての要素
echo ${#colors[@]}       # 要素数

# 要素の削除
unset colors[1]          # インデックス1の要素を削除

実行結果:

1
2
3
red
red green blue yellow
4

連想配列の操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 連想配列の宣言
declare -A config

# 値の設定
config[host]="localhost"
config[port]=8080
config[debug]="true"

# キーの一覧
echo ${!config[@]}

# 値の一覧
echo ${config[@]}

実行結果:

1
2
host port debug
localhost 8080 true

Tips・注意点

  • 整数型の利点: 自動的に算術演算が行われる

    1
    2
    
    declare -i x=10
    x=x+5  # $や(())が不要
    
  • 読み取り専用は変更不可: 一度設定したら絶対に変更できない

    1
    2
    
    declare -r MAX=100
    MAX=200  # エラー!
    
  • 配列のインデックスは0始まり: 最初の要素は[0]

    1
    2
    
    declare -a arr=("a" "b" "c")
    echo ${arr[0]}  # a
    
  • 連想配列はBash 4.0以降: 古いBashでは使えないので注意

    1
    2
    
    # バージョン確認
    bash --version
    
  • ローカル変数との組み合わせ: 関数内で使うとローカル変数になる

    1
    2
    3
    4
    
    function test() {
      local -i num=10
      # 関数の中だけで有効
    }
    
  • 属性の解除: +を使うと属性を外せる

    1
    2
    
    declare -i num=10
    declare +i num  # 整数型を解除
    

実践的な使い方

設定ファイルのような使い方

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

# 設定を連想配列で管理
declare -A config
config[app_name]="MyApp"
config[version]="1.0.0"
config[debug]="false"
config[max_connections]=100

echo "アプリ名: ${config[app_name]}"
echo "バージョン: ${config[version]}"
echo "デバッグモード: ${config[debug]}"

設定値を連想配列で管理すると、わかりやすくて便利です。

カウンター変数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash

declare -i count=0

for file in *.txt; do
  count=count+1
  echo "処理中: $file"
done

echo "合計 $count ファイル処理しました"

整数型にしておくと、計算が楽です。

定数の定義

1
2
3
4
5
6
7
8
#!/bin/bash

# 定数を定義
declare -r APP_NAME="MyApplication"
declare -r VERSION="1.0.0"
declare -r MAX_RETRY=3

echo "起動中: $APP_NAME v$VERSION"

変更されたくない値は読み取り専用にしておきます。

エラーコードの管理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

# エラーコードを連想配列で管理
declare -A ERROR_CODES
ERROR_CODES[SUCCESS]=0
ERROR_CODES[FILE_NOT_FOUND]=1
ERROR_CODES[PERMISSION_DENIED]=2
ERROR_CODES[NETWORK_ERROR]=3

if [ ! -f "$file" ]; then
  echo "Error: ファイルが見つかりません"
  exit ${ERROR_CODES[FILE_NOT_FOUND]}
fi

エラーコードに名前を付けると、わかりやすいスクリプトになります。

ユーザー入力の検証

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

declare -i age

read -p "年齢を入力してください: " age

if [ $age -lt 0 ] || [ $age -gt 150 ]; then
  echo "Error: 有効な年齢を入力してください"
  exit 1
fi

echo "あなたは ${age}歳 です"

整数型にしておくと、数値の検証がやりやすいです。

複数の変数を一度に宣言

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 関連する変数をまとめて宣言
declare -r DB_HOST="localhost"
declare -r DB_PORT=5432
declare -r DB_NAME="mydb"
declare -r DB_USER="admin"

echo "データベース接続: ${DB_HOST}:${DB_PORT}/${DB_NAME}"

typeset との違い

実はtypesetというコマンドもあって、declareとほぼ同じです。

1
2
3
# これらは同じ
declare -i num=10
typeset -i num=10

declareの方が一般的なので、基本的にはdeclareを使えばOKです。

まとめ

今回はdeclareコマンドについて解説しました。

ポイント:

  • declareで変数に型や属性を設定できる
  • -iで整数型、-rで読み取り専用、-aで配列
  • -Aで連想配列(キーと値のペア)が使える
  • -pで変数の属性を確認できる
  • シェルスクリプトで高度な変数管理が可能

普通の変数より高機能なので、シェルスクリプトを書く時に活用してください。特に配列と連想配列は覚えておくと、複雑なデータを扱う時に便利です。

次回もLinuxコマンドの学習を続けていきましょう!