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