46

変数名をループしているので、変数の内容が配列であるかどうかを確認する必要があります。

for varname in AA BB CC; do
  local val
  if [ "$varname" is array ]; then # how can I perform this test?
    echo do something with an array
  else
    echo do something with a "'normal'" variable
  fi
done

どうすればいいのですか?

4

7 に答える 7

42

grepの呼び出しを回避するには、次を使用できます。

if [[ "$(declare -p variable_name)" =~ "declare -a" ]]; then
    echo array
else
    echo no array
fi
于 2014-12-02T16:38:21.377 に答える
23

このwikiページによると、次のコマンドを使用できます。

declare -p variable-name 2> /dev/null | grep -q '^declare \-a'
于 2013-01-25T15:54:26.237 に答える
19

bash 4.3以降、それはもはやそれほど簡単ではありません。

「declare-n」を使用すると、別の変数への参照を追加でき、これを何度も繰り返すことができます。これが十分に複雑ではないかのように、「declare -p」を使用すると、型または元の変数を取得できません。

例:

$ declare -a test=( a b c d e)
$ declare -n mytest=test
$ declare -n newtest=mytest
$ declare -p newtest
declare -n newtest="mytest"
$ declare -p mytest
declare -n mytest="test"

したがって、すべての参照をループする必要があります。bashでは-これだけが次のようになります:

vartype() {
    local var=$( declare -p $1 )
    local reg='^declare -n [^=]+=\"([^\"]+)\"$'
    while [[ $var =~ $reg ]]; do
            var=$( declare -p ${BASH_REMATCH[1]} )
    done

    case "${var#declare -}" in
    a*)
            echo "ARRAY"
            ;;
    A*)
            echo "HASH"
            ;;
    i*)
            echo "INT"
            ;;
    x*)
            echo "EXPORT"
            ;;
    *)
            echo "OTHER"
            ;;
    esac
}

上記の例では:

$ vartype newtest
ARRAY

配列を確認するには、コードを変更するか、grepで使用します。

vartype $varname | grep -q "ARRAY"
于 2017-03-18T16:58:04.357 に答える
5

私は上記のルーベンの素晴らしい答えから始めました。私はいくつかのコメントと私自身の改善のいくつかを実装し、これを出しました:

#!/bin/bash
array_test() {
    # no argument passed
    [[ $# -ne 1 ]] && echo 'Supply a variable name as an argument'>&2 && return 2
    local var=$1
    # use a variable to avoid having to escape spaces
    local regex="^declare -[aA] ${var}(=|$)"
    [[ $(declare -p "$var" 2> /dev/null) =~ $regex ]] && return 0
}

今、私はこれを行うことができます:

foo=(lorem ipsum dolor)
bar="declare -a tricky"
declare -A baz

array_test foo && echo "it's an array"
array_test bar && echo "it's an array"
# properly detects empty arrays
array_test baz && echo "it's an array"
# won't throw errors on undeclared variables
array_test foobarbaz && echo "it's an array"
于 2018-06-19T23:28:21.600 に答える
1

別の方法:

例、配列を作成します。

Variable=(The Quick Brown Fox...)

変数をテストします。

if [ "${#Variable[@]}" -gt "1" ] ;
 then echo "Variable is an Array"; 
else echo "Variable is NOT an Array" ; 
fi
于 2019-02-19T18:39:54.517 に答える
0
is_array() {
  local variable_name=$1
  [[ "$(declare -p $variable_name)" =~ "declare -a" ]]
}

is_array BASH_VERSINFO && echo BASH_VERSINFO is an array

is_array() {
    local variable_name=$1
    [[ "$(declare -p $variable_name 2>/dev/null)" =~ "declare -a" ]]
}
于 2015-06-02T11:50:45.647 に答える
0

これでうまくいくと思います。配列のインデックスが「」または「0」と一致しないことを確認します。

小さなアレイと非アレイの場合は安価です。

配列インデックス内のゼロ以外の文字をテストすることで機能します

is_array() {
  eval [[ "\"\${!$1[*]}\"" =~ "[1-9]" ]]
}

an_array=(1 2 3)
wierd_array[4]=3
non_array="Joe"
unset non_exist

is_array an_array && echo pass || echo fail
is_array wierd_array && echo pass || echo fail
is_array non_array && echo fail || echo pass
is_array non_exist && echo fail || echo pass

出力は

pass
pass
pass
pass
于 2021-09-14T14:30:17.210 に答える