はじめに
今のMacのデフォルトログインシェルがzshなので、
ここ最近はzshを使うようになったのだけれど、
なんか配列に値を格納しようとしたらエラーが...
zsh: array: assignment to invalid subscript range
配列の格納を下記のように書いたらこのエラーが発生
% array[0]="test"
zsh: array: assignment to invalid subscript range
「添字(インデックス)の範囲が不正です」的な意味ですね。
今まで普通に0から指定していたはずだけどなーと思い、
念の為bashに切り替える
bashで実行
bash-3.2$ array[0]="test"
bash-3.2$ echo ${array[0]}
test
bash-3.2$
はい、普通に通りましたね。
一瞬配列自体が廃止されたのかと疑いましたが、
zshは高機能なイメージなのでそれはないだろうと...
zshでrangeを変えて実行
% array[1]="test"
% echo ${array[1]}
test
%
通りました。
結果zshはインデックスが1からスタートするタイプでした。
(cshと同じですね)
文字を使用したインデクスが使えなくなった!?
bashでは以下のように配列のインデックスに数字だけでなく、文字を指定することも可能でした。
bash-3.2$ array[a]="test"
bash-3.2$ echo ${array[a]}
test
しかし、zshでは
% array[a]="test"
zsh: array: assignment to invalid subscript range
同じく"invalid subscript range"となるので、
ダメもとで、大文字にしてみたり、"b"を入れてみたりしたけど変わらず。
まぁインデックスを文字指定することはほぼなかったですが、
指定方法が変わったとかでなく、本当に廃止されてしまったのか気になりますね。
【2023/3/26更新】 使えました
コメントで教えていただき、
無事解決しました。
zshでは事前に連想配列として変数を宣言しておく必要があるようです。
#typeset
% typeset -A array
% array=(name "太郎")
% echo ${array[name]}
太郎
% unset array
% echo ${array[name]}
%
#local
% local -A array
% array=(name "ピカ太郎")
% echo ${array[name]}
ピカ太郎
% unset array
% echo ${array[name]}
%
#dclare
% declare -A array
%
% array=(type "電気")
% echo ${array[type]}
電気
宣言してない場合
宣言する前に同じ形式で変数に値を入れてみると
% array=(name "ピカ太郎")
%
%
% echo ${array[name]}
エラーにはなりませんが、参照しても何も入っていない。
コメントにて指摘頂きましたが、この認識は誤りでした。
上記はただの配列の書き方でしたね。
エラーにならないのも当然です。。。
また配列のインデクスの指定で使われる[]は算術式として評価されるそうです。
要するにif文などと同様で[]はあくまでtestコマンドということですね。
結果以下のように書けました。
% array=(name "ピカ太郎")
#${array[1]}:name
#${array[2]}:ピカ太郎
% echo ${array[1 + 1]} #[]の中が計算され、${array[2]}となる
ピカ太郎
参考
typesetのオプションAヘルプ
-A The names refer to associative array parameters; see
`Array Parameters' in zshparam(1).
associative(連想の)でAオプションと覚えておきます。