配列変数をサポートする Bourne などのシェルでは、構文解析を使用して変数が配列であることを確認できます。
以下のコマンドはすべて実行後に実行されますa=(1 2 3)
。
zsh
:
$ declare -p a
typeset -a a
a=( 1 2 3 )
bash
:
$ declare -p a
declare -a a='([0]="1" [1]="2" [2]="3")'
ksh93
:
$ typeset -p a
typeset -a a=(1 2 3)
pdksh
そしてその派生物:
$ typeset -p a
set -A a
typeset a[0]=1
typeset a[1]=2
typeset a[2]=3
yash
:
$ typeset -p a
a=('1' '2' '3')
typeset a
次の例bash
:
if declare -p var 2>/dev/null | grep -q 'declare -a'; then
echo array variable
fi
この方法はあまりにも多くの作業を必要とし、サブシェルを作成する必要があります。=~
inなどの他のシェル組み込み機能を使用すると、サブシェルは[[ ... ]]
必要ありませんが、まだ複雑すぎます。
これを行うより簡単な方法はありますか?
ベストアンサー1
私はあなたができるとは思わず、実際には何の違いもないと思います。
unset a
a=x
echo "${a[0]-not array}"
x
ksh93
これはとで同じことを行いますbash
。可能だと思うみんな変数はこれらのシェルの配列であるか、少なくとも特別な属性が割り当てられていない一般的な変数ですが、あまりチェックしていません。
マニュアルbash
では、割り当てを使用するときの配列と文字列変数のさまざまな動作について説明します+=
が、配列は次の状況でのみ異なる動作をするのを防ぎ、指定します。化合物コンテキストを割り当てます。
また、値が添え字に割り当てられると、変数は配列として扱われ、空の文字列の可能性が明示的に含まれていることを示します。上記では、通常の割り当てにより必ず添え字が割り当てられることがわかる。したがって、すべてが配列のようです。
実際には、次のものを使用できます。
[ 1 = "${a[0]+${#a[@]}}" ] && echo not array
...値が0の単一添え字のみが割り当てられたコレクション変数を明確に見つけます。