Estoy escribiendo un script de bash que tiene set -u
, y tengo un problema con la expansión de matriz vacía: bash parece tratar una matriz vacía como una variable no configurada durante la expansión:
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
( declare -a arr
tampoco ayuda)
Una solución común a esto es usar ${arr[@]-}
en su lugar, sustituyendo así una cadena vacía en lugar de la matriz vacía ("indefinida"). Sin embargo, esta no es una buena solución, ya que ahora no puede distinguir entre una matriz con una sola cadena vacía y una matriz vacía. (@ -Ampliación es especial en bash, se expande "${arr[@]}"
en "${arr[0]}" "${arr[1]}" …
, lo que hace que sea una herramienta perfecta para la construcción de líneas de comando.)
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
Entonces, ¿hay alguna forma de solucionar ese problema, además de verificar la longitud de una matriz en un if
(ver ejemplo de código a continuación), o desactivar la -u
configuración para esa pieza corta?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
Actualización:bugs
etiqueta eliminada debido a la explicación de ikegami.
"${arr[@]}"
. ¿Me estoy perdiendo de algo? Por lo que puedo ver, funciona al menos en5.x
.