我有一个循环变量名称,我需要检查该名称指向的变量是否是一个数组。我试图谷歌,但没有找到任何东西。有什么帮助吗?
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
答案 0 :(得分:31)
为避免调用grep,您可以使用:
if [[ "$(declare -p variable_name)" =~ "declare -a" ]]; then
echo array
else
echo no array
fi
答案 1 :(得分:14)
Google可能是your friend:
declare -p variable-name 2> /dev/null | grep -q '^declare \-a'
答案 2 :(得分:8)
从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"
答案 3 :(得分:1)
我从上面的Reuben的great answer开始。我实施了一些评论和我自己的一些改进,并得出了以下结论:
#!/bin/bash
array_test() {
# no argument passed
[[ $# -ne 1 ]] && echo 'Supply a variable name as an argument'>&2 && return 2
var=$1
# use a variable to avoid having to escape spaces
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"
答案 4 :(得分: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" ]]
}
答案 5 :(得分:-1)
另一种方式:
示例,创建一个数组:
Variable=(The Quick Brown Fox...)
测试变量:
if [ "${#Variable[@]}" -gt "1" ] ;
then echo "Variable is an Array";
else echo "Variable is NOT an Array" ;
fi