2020-01-29 :-|
_ 労
ストレージ労。粛々と変更。
_ [bash][連想配列][hash][ハッシュ]bash の連想配列が割り当てられてるかどうか判断する
bash で set -u すると未割り当ての変数でエラーとなるので、それをチェックしたい話題。
Check if array is empty in Bash - Server Fault
bash 4.4 以上ならもう少しだけ楽らしいが都合により。
- GNU bash, バージョン 4.3.11(1)-release (x86_64-pc-linux-gnu)
その1
こういう処理
#!/bin/bash
declare -A arr
arr=([a]=A [b]=B [c]=C)
if [ ${#arr[@]} -eq 0 ]
then
echo empty
else
echo not empty
fi
arr=()
if [ ${#arr[@]} -eq 0 ]
then
echo empty
else
echo not empty
fi
echo ${arr[a]} # これがエラーになる
set -u しないときは怒られない。
% /bin/bash arr.sh not empty empty
set -u するとエラーになる
% /bin/bash -u arr.sh not empty empty arr.sh: 行 21: arr[a]: 未割り当ての変数です
その2
連想配列が 2 つあって、片方にキーが存在しない場合も上記と同様にエラーとなってしまうので、キーが存在するかチェックしてから値を取らないといけない。
#!/bin/bash
set -u
declare -A arr1
declare -A arr2
arr1=([a]=A [b]=B [c]=C)
arr2=([a]=A [b]=B)
for k in ${!arr1[@]}
do
n=""
(( ${#arr2[${k}]} )) && n=${arr2[${k}]}
if [ "x" = "x${n}" ]; then
echo "not exist ${n}"
else
echo "exist ${n}"
fi
done
% /bin/bash -u arr1.sh exist A exist B not exist
[ツッコミを入れる]



