1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Zsh】Zshの配列はインデックスが1から始まる...

Last updated at Posted at 2023-03-25

はじめに

今の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オプションと覚えておきます。

1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?