declareコマンドはBash組み込みコマンドの一つになります。declareコマンドは変数を宣言するコマンドです。また、Bashの変数宣言はdeclareコマンドを使用しなくても行うことが出来ます。しかし、declareコマンドは変数に対して何かの制限等を与える場合に使用することが出来ます。
また、関数内でdeclareコマンドで宣言した変数のスコープは基本的にローカル変数として扱われます。
目次
- 1 declareコマンドの利用例
- 1.1 変数宣言と変数の確認 (オプションなし)
- 1.2 変数の確認 (-pオプション)
- 1.3 関数名の確認 (-Fオプション)
- 1.4 グローバル変数宣言 (-gオプション)
- 1.5 配列宣言 (-aオプション)
- 1.6 連想配列宣言 (-Aオプション)
- 1.7 関数を確認 (-fオプション)
- 1.8 nameref属性の変数宣言 (-nオプション)
- 1.9 小文字変換の変数宣言 (-lオプション)
- 1.10 大文字変換の変数宣言 (-uオプション)
- 1.11 読み込み専用の変数宣言 (-rオプション)
- 1.12 トレース属性を付与 (-tオプション)
- 1.13 環境変数の宣言 (-xオプション)
- 1.14 属性をオフに
- 2 参考
declareコマンドの利用例
変数宣言と変数の確認
(オプションなし)
declareコマンドは変数宣言を行うコマンドになります。ただし、変数を使用する場合、declareコマンドを利用せずに変数名と値の代入を行うことでその変数を利用できます
コマンド例
1 |
declare var1="aaa" |
または
1 |
var1="aaa" |
実行結果
1 2 |
$ echo $var1 aaa |
また、declareコマンドを引数なしで利用するとすべての変数(関数を含む)の値を確認できます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ bash -c "declare" | head -n 5 BASH=/bin/bash BASHOPTS=cmdhist:complete_fullquote:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() |
変数の確認
(-pオプション)
-pオプションを用いることで現在の変数名とその変数の属性を確認できます。引数がない場合はすべての変数名とその変数の属性を表示します。
コマンド例と実行結果
1 2 3 4 5 6 |
$ declare -p | head -n 5 declare -- BASH="/bin/bash" declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath" declare -ir BASHPID declare -A BASH_ALIASES='()' declare -a BASH_ARGC='()' |
引数に変数名や他のオプションが存在する場合は変数名やオプションの条件に当てはまる変数に絞って確認できます。
コマンド例と実行結果
1 2 3 4 5 |
$ declare var1="aaa" $ declare var2=8 $ declare -p var1 var2 declare -- var1="aaa" declare -- var2="8" |
関数名の確認
(-Fオプション)
-Fオプションを用いることで関数名を確認できます。このオプションでは関数の定義が表示されないので、関数をさっと確認するのに便利です。
コマンド例と実行結果
1 2 3 4 5 6 |
$ declare -F | head -n 5 declare -f __expand_tilde_by_ref declare -f __get_cword_at_cursor_by_ref declare -f __git_eread declare -f __git_ps1 declare -f __git_ps1_colorize_gitstring |
グローバル変数宣言
(-gオプション)
declareコマンドを関数内で用いるとdeclareコマンドで宣言した変数はローカル変数として扱われます。ローカル変数はlocalコマンドでも宣言することができます。
-gオプションを用いるとグローバル変数として扱われ、関数のスコープの外にある変数にアクセスして代入できます。
script.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash var1="aaa" var2="bbb" func1(){ declare var1="hello" declare -g var2="world" } func1 echo "no_opt: $var1" echo "g_opt: $var2" |
コマンド例と実行結果
1 2 3 |
$ ./script.sh no_opt: aaa g_opt: world |
配列宣言
(-aオプション)
-aオプションを用いると配列の宣言ができます。以下の例では空の配列は"declare -p -a"で表示されないため、grepコマンドを用いて、変数の確認を行っています。
コマンド例と実行結果
1 2 3 |
$ declare -a array1 $ declare -p | grep "array1=" declare -a array1='()' |
bashで配列を用いる場合、"()"を用いて、変数名=(値1 値2 ...)のように記述することで変数を配列として利用できます。さらに"()"と+=演算子を用いると配列の追加を行うこともできます。
コマンド例と実行結果
1 2 3 4 5 6 7 |
$ array1=("aaa" "bbb") $ array1+=("ccc") $ declare -p array1 declare -a array1='([0]="aaa" [1]="bbb" [2]="ccc")' $ $ echo ${array1[0]} aaa |
連想配列宣言
(-Aオプション)
-Aオプションを用いることで、連想配列を利用できます。連想配列は通常の配列と違い、インデックスとして文字列のような数値ではない値を用いることができます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
$ declare -A hash1 $ hash1[data1]="aaa" $ hash1[data2]="bbb" $ declare -p hash1 declare -A hash1='([data1]="aaa" [data2]="bbb" )' $ $ declare -A hash2=([data1]="ccc" [data2]="ddd") $ declare -p hash2 declare -A hash2='([data1]="ccc" [data2]="ddd" )' $ $ echo ${hash1[data1]} ${hash1[data2]} ${hash2[data1]} ${hash2[data2]} aaa bbb ccc ddd |
関数を確認
(-fオプション)
-fオプションは関数を指定するときに使うオプションになります。-pオプションと組み合わせると関数の定義を確認できます。
コマンド例と実行結果
1 2 3 4 5 6 |
$ testfunc() { echo "test"; } $ declare -p -f testfunc testfunc () { echo "test" } |
nameref属性の変数宣言
(-nオプション)
-nオプションを用いると別の変数を参照するnameref属性の変数を利用できます。nameref属性は変数名を利用します。
コマンド例と実行結果
1 2 3 4 |
$ var=20 $ declare -n ref=var $ echo $ref 20 |
このnameref属性の変数は関数で変数を渡したい場合に利用できます。
nameref.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash distance_calc() { declare -n speed=$1 declare -n time=$2 if [ ${#speed[@]} = ${#time[@]} ]; then for (( i=0; i<${#speed[@]}; i++ )); do echo "speed(m/s):${speed[$i]}, time(sec):${time[$i]}, distance(m):$((${speed[$i]} * ${time[$i]}))" done fi } v=(10 20 30 40) t=(5 10 20 30) distance_calc v t |
コマンド例と実行結果
1 2 3 4 5 |
$ ./nameref.sh speed(m/s):10, time(sec):5, distance(m):50 speed(m/s):20, time(sec):10, distance(m):200 speed(m/s):30, time(sec):20, distance(m):600 speed(m/s):40, time(sec):30, distance(m):1200 |
小文字変換の変数宣言
(-lオプション)
-lオプションを用いると変数の値が小文字に変換される変数を利用できます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ declare -l var1="AAA" $ declare -l -p var1 declare -l var1="aaa" $ echo $var1 aaa $ var1="BBB" $ echo $var1 bbb |
大文字変換の変数宣言
(-uオプション)
-uオプションを用いると変数の値が大文字に変換される変数を利用できます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ declare -u var1="aaa" $ declare -u -p var1 declare -u var1="AAA" $ echo $var1 AAA $ var1="bbb" $ echo $var1 BBB |
読み込み専用の変数宣言
(-rオプション)
-rオプションを用いると読み込み専用の変数を利用できます。
コマンド例と実行結果
1 2 3 4 5 |
$ declare -r readonly_var="aaa" $ echo $readonly_var aaa $ readonly_var="bbb" bash: readonly_var: readonly variable |
読み込み専用の変数はスクリプト上では特に問題ありませんが、端末上で使用してしまった場合、Bashではunsetコマンド等を用いてもその変数を削除することができません。しかし、以下の記事のようにGDBを用いるとその変数を削除する方法もあります。
参考:Bash で readonly した変数を再度編集可能にする - Qiita
トレース属性を付与
(-tオプション)
-tオプションを用いるとトレース属性を付与できます。この属性は関数に利用でき、DEBUGやRETURNのトラップが関数に継承されます。
trace.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/bash func1(){ echo "func1 process...1" echo "func1 process...2" echo "func1 process...3" } if [ $functrace ] ; then declare -ft func1 fi trap 'echo debug' DEBUG echo "Begin script process" func1 echo "End script process" |
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ ./trace.sh debug Begin script process debug func1 process...1 func1 process...2 func1 process...3 debug End script process $ $ functrace=1 ./trace.sh debug Begin script process debug debug debug func1 process...1 debug func1 process...2 debug func1 process...3 debug End script process |
環境変数の宣言
(-xオプション)
-xオプションを用いると環境変数として変数を利用できます。exportコマンドを用いても環境変数を利用することができます。
コマンド例と実行結果
1 2 3 4 5 6 7 8 |
$ declare -x var1="aaa" $ declare -p var1 declare -x var1="aaa" $ $ export var2="bbb" $ declare -p var1 var2 declare -x var1="aaa" declare -x var2="bbb" |
属性をオフに
属性をオフにしたい場合は、オプションの'-'を'+'の記号を用いることでその属性をオフにできます。ただし、読み込み専用の属性は解除できません。
コマンド例と実行結果
1 2 3 4 5 6 |
$ declare -p var1 declare -x var1="aaa" $ $ declare +x var1 $ declare -p var1 declare -- var1="aaa" |
参考
Bash Reference Manual: Bash Builtins