Como converter uma string em uma matriz no script bash?

2

Estou tentando converter uma string em uma matriz e fazer o loop dessa matriz para passar cada valor como um parâmetro para um comando bash. Estou recebendo uma mensagem de substituição ruim quando executo os scripts.

text = 'xdc','cde','erd','ded','ded','kie';
OIFS=$IFS;
IFS=',';
ids=$($text);
for (i=0; i<${#ids[@]}; ++i);
do
echo "$i"
done
IFS=$OIFS

Este é o script que escrevi, também como passar o valor do índice como um parâmetro para um comando dentro do loop for.

    
por Jes 11.08.2016 / 13:40

2 respostas

6

Primeiro, você precisa remover o texto da atribuição da variável de string:

text="'xdc','cde','erd','ded','ded','kie';"

Você pode usar o formulário de matriz do comando bash read :

IFS=, read -a ids <<< "${text%;}"

em que a substituição ${text%;} remove o ponto-e-vírgula final. Observe que, dessa forma, o IFS não é modificado fora do comando read , portanto não é necessário salvá-lo e restaurá-lo.


Sua sintaxe for-loop no estilo C está quase correta, exceto que no bash, o loop precisa de parênteses duplos, por exemplo,

for ((i=0; i<${#ids[@]}; ++i)); do printf '%s\n' "${ids[i]}"; done

Como alternativa, você pode fazer um loop pelos membros da matriz diretamente usando um for ... in loop:

for i in "${ids[@]}"; do printf '%s\n' "$i"; done
    
por steeldriver 11.08.2016 / 13:49
1

Isso refletirá todos os itens da sua string inicial, garantirá que não haja espaço próximo ao = in text= e use aspas duplas ao redor da string. Além disso, você está usando ; s desnecessários em todo o seu código.

#!/bin/bash

text="'xdc','cde','erd','ded','ded','kie'"

IFS=',' read -ra ids <<< "$text"

for i in "${ids[@]}"
do
echo "$i"
done

Isto irá produzir

'xdc'
'cde'
'erd'
'ded'
'ded'
'kie'
    
por Arronical 11.08.2016 / 13:52