Por que meu array bash sempre tem comprimento 1 quando eu divido?

2
# Create array
arrayLong=(one two three four)
for element in "${arrayLong[@]}"
do
    echo "$element"
done
echo "${#arrayLong[@]}"

Saída:

one
two
three
four
4

Então:

# Make new array with only first half of values
arrayShort=("${arrayLong[@]:0:2}")
for element in "${arrayShort[@]}"
do
    echo "$element"
done
echo "${#arrayShort[@]}"

A saída disso é

one two
1

Por que meu array curto não é realmente um array? É apenas um elemento. Como posso dividir minha matriz quando os resultados estão cheios em matrizes?

Minha versão bash é GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)

    
por teradyl 23.09.2017 / 00:56

1 resposta

3

Eu não sabia que IFS não é redefinido automaticamente depois de usá-lo. Anteriormente no código, eu tinha definido o IFS=$'\n' sem armazenar o valor original. Aqui está o que eu deveria ter feito:

# set Internal Field Separator to new line only to split files
oIFS="$IFS"
IFS=$'\n'
array=(${all_files})
# Return IFS to initial value
IFS="$oIFS"

Para verificar novamente o que é o IFS em um determinado momento, tente printf "%q\n" "$IFS" . O valor padrão deve ser $' \t\n'

Obrigado @MiniMax & @Jesse_b por ajudar com isso.

    
por 26.09.2017 / 01:15

Tags