Reputation: 2583
I need to test if certain environment variables are set before running my script. I'm using a technique from this answer:
if [ -z ${var1+x} ]
echo "var1 not set"
exit 1
fi
This works well for string variables, but there's a parameter which needs to be an array. It has to be set, but could be empty.
foo=("foo" "bar" "baz")
[ -z ${foo+x} ] # false
bar=()
[ -z ${bar+x} ] # true
[ -z ${baz+x} ] # also true
So, my question is how do I declare an empty array to make it distinct from unset variable. I'd also like to test if variable is array (whether empty or not) or non array (whether set or unset).
Upvotes: 3
Views: 922
Reputation: 7287
Or use this method
[[ ${var[@]@A} =~ '-a' ]] && echo array || echo variable
Based on this
$ man bash
...
${parameter@operator}
Parameter transformation. The expansion is either a transformation of the value of parameter or information about parameter itself, depending
on the value of operator. Each operator is a single letter:
Q The expansion is a string that is the value of parameter quoted in a format that can be reused as input.
E The expansion is a string that is the value of parameter with backslash escape sequences expanded as with the $'...' quoting mechansim.
P The expansion is a string that is the result of expanding the value of parameter as if it were a prompt string (see PROMPTING below).
A The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with
its attributes and value.
a The expansion is a string consisting of flag values representing parameter's attributes.
If parameter is @ or *, the operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter
is an array variable subscripted with @ or *, the case modification operation is applied to each member of the array in turn, and the expan‐
sion is the resultant list.
The result of the expansion is subject to word splitting and pathname expansion as described below.
...
Upvotes: 1
Reputation: 241918
You can use declare -p
to find out what type a variable is.
scalar=1
declare -p scalar # declare -- scalar="1"
arr=(1 2 3)
declare -p arr # declare -a arr=([0]="1" [1]="2" [2]="3")
Undeclared variable will exit with value 1:
unset arr
declare -p arr # bash: declare: arr: not found
echo $? # 1
To test whether an array is empty, test ${#arr[@]}
.
arr=(1 2 3)
echo ${#arr[@]} # 3
arr=()
echo ${#arr[@]} # 0
Upvotes: 5
Reputation: 1963
You can use declare -p to check the variable type
$ list=()
$ declare -p list
declare -a list='()'
If the output contains "-a" your var is an array, even if empty
Upvotes: 4