Jogar com espaços, tabulações ou novas linhas está sempre perto de falhas.
O problema central ocorre aqui:
encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 )
IFS=$'\n'
printf '<0 %s>\n' "${encl0[@]#0,}"
Se executado no bash 3.2:
$ b32sh ./script
<0 0 1 2 3 4 5 7 8 9>
A expansão de "${encl0[@]#0,}"
é processada como uma string, não uma lista de valores.
O problema não se manifesta se o IFS tiver um espaço ou se a expansão não editar cada valor da matriz:
#!/bin/bash
encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 )
IFS=$' \n'
printf '<0 %s>\n' "${encl0[@]#0,}"
Executado:
$ b32sh ./script
<0 0>
<0 1>
<0 2>
<0 3>
<0 4>
<0 5>
<0 7>
<0 8>
<0 9>
Ou:
#!/bin/bash
encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 )
IFS=$'\n'
printf '<0 %s>\n' "${encl0[@]}"
Executado:
b32sh ./so
<0 0,0>
<0 0,1>
<0 0,2>
<0 0,3>
<0 0,4>
<0 0,5>
<0 0,7>
<0 0,8>
<0 0,9>
O problema está oculto no seu script porque você restaura o IFS IFS=$OLDIFS
antes da linha de eco de teste.
Uma maneira de evitar o problema é não usar um espaço no printf:
#!/bin/bash
encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 0,10 0,11 0,12 0,13 0,14 0,15 )
MISSING_DISKS=()
OLDIFS=$IFS
IFS=$' \n'
MISSING_DISKS+=($({ printf '0x%s\n' {0..15}; printf '0x%s\n' "${encl0[@]#0,}"; } | sort | uniq -u))
echo "test $({ printf '0x%s\n' {0..15}; printf '0x%s\n' "${encl0[@]#0,}"; } | sort | uniq -u)"
echo "var ${MISSING_DISKS[@]}"
if ((${#MISSING_DISKS[@]}>1)); then
echo "Greater than 1"
else
echo "Success"
fi
IFS=$OLDIFS
A outra alternativa é evitar a expansão com substituição depois de alterar o IFS para uma nova linha usando uma matriz alternativa:
#!/bin/bash
OLDIFS=$IFS
encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 0,10 0,11 0,12 0,13 0,14 0,15 )
IFS=$' \n'; arr=("${encl0[@]#0,}")
MISSING_DISKS=()
IFS=$'\n'
MISSING_DISKS+=($({ printf '0 %s\n' {0..15}; printf '0 %s\n' "${arr[@]}"; } | sort | uniq -u))
echo "test $({ printf '0 %s\n' {0..15}; printf '0 %s\n' "${arr[@]}"; } | sort | uniq -u)"
echo "var ${MISSING_DISKS[@]}"
if ((${#MISSING_DISKS[@]}>1)); then
echo "Greater than 1"
else
echo "Success"
fi
IFS=$OLDIFS
Eu recomendo que você:
- Siga a regra de que as variáveis no CAPS são variáveis de ambiente.
- Não há necessidade de aumentar
+=
uma matriz vazia nesse ponto no códigoMISSING_DISKS+=
. - Use um caractere não espacial no printf para evitar a necessidade de remover o espaço do IFS posteriormente. Isso torna o script mais robusto.
Se essas alterações forem feitas, o script se tornará:
#!/bin/bash
oldIFS=$IFS
encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 0,10 0,11 0,12 0,13 0,14 0,15 )
unset missing_disks
IFS=' '
arr=($(printf '0-%s\n' "${encl0[@]#0,}"))
arr+=($(printf '0-%s\n' {0..15}))
missing_disks=($(printf '%s\n' "${arr[@]}" | sort | uniq -u))
echo "test $(printf '0-%s\n' "${arr[@]}" | sort | uniq -u)"
echo "var ${missing_disks[@]}"
((${#missing_disks[@]}>1)) && echo "Greater than 1" || echo "Success"
IFS=$oldIFS