typeset
がお手軽。
declare
はtypeset
のエイリアスなのでdeclare
でも可。
ただし、typeset -h
またはtypeset -H
で宣言されている変数は値が表示されない(これらを表示)。
文字列
$ s='hello world'
$ typeset s
s='hello world'
配列
$ a=(hoge moge sage)
$ typeset a
a=( hoge moge sage )
$ typeset -p a
typeset -a a=( hoge moge sage )
# -p 1をつけると要素ごとに改行する
$ typeset -p 1 a
typeset -a a=(
hoge
moge
sage
)
# -pをつけると、-Hで宣言された変数は値が表示されない
$ typeset -aH a=(1 2)
$ typeset -p a
typeset -a a
連想配列
$ typeset -A aa=(a 1 b 2 c 3)
$ typeset aa
aa=( [a]=1 [b]=2 [c]=3 )
$ typeset -p aa
typeset -A aa=( [a]=1 [b]=2 [c]=3 )
# -p 1をつけると要素ごとに改行する
$ typeset -p 1 aa
typeset -A aa=(
[a]=1
[b]=2
[c]=3
)
定義されていない変数
$ typeset lajsd
(出力なし)
$ typeset -p lajsd
typeset: no such variable: lajsd
全変数を表示するには
$ set
-Hつきの変数の値も表示するには
以下の関数を定義する。
tp() {
emulate -LR zsh
local variable_name="$1"
local type="${(tP)variable_name}"
local i
print -r -- "$type"
if [[ "$type" == *array* ]]; then
for i in ${(P)variable_name}; do
print -r -- "${(q)i}"
done
elif [[ "$type" == *association* ]]; then
for i in ${(kP)variable_name}; do
print -r -- "${(q)i} ${(q)${(P)variable_name}[$i]}"
done
else
print -r -- "${(qP)variable_name}"
fi
}
emulate -R zsh
typeset -H str='hoge moge'
typeset -Ha arr=('hoge moge' 'sage peso')
typeset -HA assoc=('hoge moge' 1 'sage peso' 2)
tp str
# =>
# scalar-hideval
# hoge\ moge
tp arr
# =>
# array-hideval
# hoge\ moge
# sage\ peso
tp assoc
# =>
# association-hideval
# sage\ peso 2
# hoge\ moge 1
変数展開フラグ (P)
は展開結果をさらに変数名として展開を行う。
(t)
は変数の型に展開する。
(q)
はクォートする。