
Eu tenho algumas variáveis a , b e c.
Em um loop for, eu queria exibir todos os seus valores.
for i in ${!a[@]}; do
echo "${a[$i]} ${b[$i]} ${c[$i]}"
done
Agora os valores são deslocados para o topo, pois outros valores na variável c estão intencionalmente vazios.
mammals land elephant
reptile water pigeon
birds air
Como crio uma variável vazia para que os valores não sejam alterados?
Eu tentei fazer se a string correspondesse a "água", então ela ecoaria apenas a e b.
for i in ${!a[@]}; do
if [ "$c" = "water"]; then
echo "${a[$i]} ${b[$i]}"
else
echo "${a[$i]} ${b[$i]} ${c[$i]}"
fi
done
Responder1
Você está procurando algo parecido com isto?
a=("" b c)
b=(d "" f)
c=(g h "")
for i in ${!a[@]}; do
printf "%s\t" "${a[$i]}" "${b[$i]}" "${c[$i]}"
echo
done
A saída é
$ bash arr.sh
d g
b h
c f
Usei strings vazias para marcar valores "ausentes" na diagonal. Na atribuição composta não é possível pular um índice, tem que haver algo ali. É claro que você poderia usar a[1]=b a[2]=c
e deixar a[0]
unassigned ou explicitamente unset a[0]
.
Se você precisar de uma matriz bidimensional adequada, talvez queira usar uma linguagem de programação adequada e não o shell ... Algum tipo de solução alternativa seria usar matrizes associativas com chaves como 2-3
, com os dois índices delimitados por alguma string. Mas depende do que você realmente está fazendo.
(No seu último trecho, você está usando $c
sem um índice (obtendo o mesmo que ${c[0]}
e depois usando um índice em EMPTY
, mesmo que tenha atribuído apenas um valor a ele).