[Linux] declare でシェル変数と環境変数を定義する方法

[Linux] declare でシェル変数と環境変数を定義する方法

declare コマンド

declare コマンドはシェル変数や環境変数を宣言するために使うコマンドです。このコマンドを使わなくても変数の宣言はできますが、declare コマンドのオプションを利用することでいろいろなことができます。

オプションを使って特殊な属性を変数に付与することで、明示的に処理の実装を進めることが可能です。

declare コマンドの使い方

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

オプションを使えば環境変数やグローバル変数のようにスコープを変更したり、様々な機能を追加して変数を宣言できます。

オプションまとめ

  • -a: 配列を定義
  • -A: 連想配列を定義
  • -i: 整数として定義
  • -l: 小文字の文字列として定義
  • -n: 名前参照として定義
  • -r: 読み取り専用変数として定義
  • -t: トーレス可能な変数として定義
  • -u: 大文字の文字列として定義
  • -x: 環境変数として定義(exportする)
  • -g: 関数内で使用時、グローバル変数として定義

declare --help で確認できます。幾つかよく使いそうなオプションをピックアップして使い方とその結果をまとめます。

いろいろな変数定義

シェル変数

シェル変数を定義するには以下のようにします。

$ declare my_value=ABC
$ echo $my_value
ABC

-x: 環境変数

環境変数として定義するにはオプション -x を使用します。-x を使用した場合、変数を export した結果と同じになります。

# -x でグローバル変数を定義
$ declare -x my_env_value=AAA

$ printenv | grep 'my_env_value'
my_env_value=AAA

printenv で環境変数を一覧できます。結果を grep したところ環境変数として定義されていることが確認できました。

declare -pexport -p でも同じように環境変数が確認できます。

グローバル変数とローカル変数

関数内で declare コマンドを使用すると、オプションがなければローカル変数として定義されます。-g オプションを使用すればスクリプト内のグローバルに変数を定義されます。スコープを明示しないと狭いスコープとなります。

my_script.sh を以下のように定義します。

#!/bin/bash

function set_my_value() {
    declare -x my_env_value='ENV'
    declare -g my_global_value='GLOBAL'
    declare my_local_value='LOCAL'
    my_value='XXX'
}

set_my_value
echo $my_env_value
echo $my_global_value
echo $my_local_value
echo $my_value

実行結果はこのようになります。

# グローバル変数とローカル変数、ただの?変数
$ bash my_script.sh

GLOBAL

XXX

[変数名]=[値] で定義した変数はグローバルになるみたいですね。-x を付けて定義してもローカル扱いです。

-i: 整数として変数定義する

-i を付ければ整数として変数を定義できます。

例えばゼロ埋めされた文字列を整数として定義すると、整数としてゼロを取った値になります。

# -i で整数として変数を定義
$ declare -i num=001
$ echo $num
1

# -i がないと文字列となるのでそのまま
$ declare str=001
$ decho $str
$ echo $str
001

整数に変換できないような値を定義すると以下のようになります。

# 小数はエラー
$ declare -i val=0.01
-bash: declare: 0.01: syntax error: invalid arithmetic operator (error token is ".01")

# 数値変換できない文字列ならゼロになる
$ declare -i val=ABC
$ echo $val

-l, -u: 値を大文字小文字で固定させる

変数定義の際に、その値を大文字(もしくは小文字)に固定することができます。

# 変数定義時に値を小文字に変換して定義
$ declare -l my_lowercase_value='AbCdE'
$ echo $my_lowercase_value
abcde

# 変数定義時に値を大文字に変換して定義
$ declare -u my_uppercase_value='AbCdE'
$ echo $my_uppercase_value
ABCDE

-r: 読み取り専用変数として定義

-r オプションを使用することで変数を読み取り専用として定義できます。-r を付けて定義した変数は上書きしようとするとエラーになります。

$ declare -r READONLY_VALUE=123
$ echo $READONLY_VALUE
123
$ READONLY_VALUE=ABC
-bash: READONLY_VALUE: readonly variable

複数のオプションをまとめて使う

これまでのオプション複数をまとめて使用することもできます。

例えば読み取り専用で大文字、環境変数として定義します。

$ declare -xur MY_VALUE=xxx

# 大文字で定義される
$ echo $MY_VALUE
XXX

# 読み取り専用のため上書き不可
$ MY_VALUE=123
-bash: MY_VALUE: readonly variable

# 環境変数として定義される
$ declare -p | grep MY_VALUE
declare -rxu MY_VALUE="XXX"

参考URL

Linuxカテゴリの最新記事