Como inserir uma string na matriz de maneira diferente

3

Eu tenho uma string como abaixo. str = '014387650' Agora quero dividir essa string como abaixo e colocar o valor na matriz.

A[0]=0  
A[1]=01  
A[2]=014  
A[3]=0143  
A[4]=01438  
A[5]=014387  
A[6]=0143876  
A[7]=01438765  
A[8]=014387650  
    
por user3548033 04.01.2016 / 06:44

7 respostas

5

O seguinte deve funcionar em bash :

str='014387650'
arr=()
for ((i=0; i<${#str}; i++)); do
    arr+=("${arr[i-1 < 0 ? 0 : i-1]}${str:$i:1}")
done

O resultado:

$ printf '<%s>\n' "${arr[@]}"
<0>
<01>
<014>
<0143>
<01438>
<014387>
<0143876>
<01438765>
<014387650>
    
por 04.01.2016 / 06:59
1

A declaração explícita de uma matriz é feita usando a declaração interna:

  declare -a ARRAYNAME 

Variáveis de matriz também podem ser criadas usando atribuições compostas neste formato:

  ARRAY=(value1 value2 ... valueN) 

no seu caso:

  #!/bin/bash
  str='014387650'
  declare -a A
  for (( c=0; c<${#str}; c++ ))
  do
    A[c]='echo ${str:0:$(( $c + 1 ))}'
    echo "A[$c]="${A[$c]} 
  done

saída:

   A[0]=0
   A[1]=01
   A[2]=014
   A[3]=0143
   A[4]=01438
   A[5]=014387
   A[6]=0143876
   A[7]=01438765
   A[8]=014387650

se você quiser apenas colocar a string em uma matriz:

   declare -a A
   str=014387650
   A=${str[*]}
   echo ${A[*]}
   014387650
   echo ${A[3]}
   4
    
por 04.01.2016 / 07:16
1

Outra maneira:

triangle_split() {
  _len=1
  while [ "$_len" -le "${#1}" ]; do
    printf '%.*s\n' "$_len" "$1"
    : "$((_len+=1))"
  done
}

IFS='
'
A=($(triangle_split 014387650))

printf '%s\n' "${A[@]}"
    
por 04.01.2016 / 07:28
0

Você pode fazer:

set --; src=014387650 OPTIND=1 tgt=
while   getopts : na -"$src"
do      tgt=$tgt$OPTARG
        set "$@" "A[$#]=$tgt"
done;   printf   %s\n "$@"
A[0]=0
A[1]=01
A[2]=014
A[3]=0143
A[4]=01438
A[5]=014387
A[6]=0143876
A[7]=01438765
A[8]=014387650
    
por 04.01.2016 / 20:46
0

Abordagem óbvia: preencha o array de trás para a frente e corte o último caractere da string à medida que formos:

#!/bin/bash

str="014387650"

i=${#str}

while [ $i -gt 0 ] ; do
  A[$((--i))]=$str
  str=${str%?}
done

printf "%s\n" ${A[*]}

Saída:

0
01
014
0143
01438
014387
0143876
01438765
014387650
    
por 04.01.2016 / 20:52
0

Abordagem óbvia: vamos percorrer para baixo o array, cortando um caractere de cada vez a partir da cauda de uma variável de string que é atribuída aos elementos sucessivos:

#!/bin/bash

str="014387650"

while [ ${#str} -gt 0 ] ; do
  A[$((${#str}-1))]=$str
  str=${str%?}
done

printf "%s\n" ${A[*]}

Saída:

0
01
014
0143
01438
014387
0143876
01438765
014387650

Como somos específicos do Bash, podemos reformular a lógica usando um for loop:

#!/bin/bash

str="014387650"

for (( i=${#str} - 1; i >= 0; i-- )); do
  A[$i]=$str
  str=${str%?}
done

printf "%s\n" ${A[*]}
    
por 04.01.2016 / 20:58
0

Talvez isso ajude:

#!/bin/bash

a="014387650"

i=0; unset -v A B
while (( i<${#a} ))
do    A[i]=${a:0:i+1}
      B+=("A[$i]=${A[i++]}")
done

printf '%s\n' "${B[@]}"

Saída:

A[0]=0
A[1]=01
A[2]=014
A[3]=0143
A[4]=01438
A[5]=014387
A[6]=0143876
A[7]=01438765
A[8]=014387650
    
por 05.01.2016 / 02:54