acessa elementos na matriz de strings - stray @ symbol

2

Eu criei uma matriz (3 elementos) e cada elemento contém uma string delimitada por vírgula. A matriz foi criada lendo um arquivo linha por linha - o arquivo contém campos de saída de um banco de dados. Eu escrevi o código abaixo para iterar através de cada elemento de string, como se fosse um array.

Funciona, com exceção de um erro estranho, o último elemento na matriz possui um símbolo @ adicional

(também declare -A não funcionou, embora eu tenha me certificado de que estou usando o bash 4 no meu mac)

i=0
declare -a items
while read line
    do
        items[i]=$line
    ((i++))
    done < test_file1.txt

declare -a item_arr
for item in "${items[@]}"
   do
     item_arr=($item[@])
   done
echo "${item_arr[4]}://${item_arr[1]}:${item_arr[3]}@${item_arr[2]}/control/configinfo"

a saída é: https [@]: //192.168.1.152: nome de usuário @ pwd / control / configinfo

Por que o símbolo @ é impresso? Estou perdendo meu tempo? Eu deveria ter usado o awk? de outra forma, parece um caminho bastante direto, mas pode ser assim que eu sou relativamente inexperiente. Potencialmente, a maioria dos itens que eu preciso inicializar é de 1 a 200.

A finalidade do meu código é criar uma solicitação de curl para obter alguns config_info, o nome de usuário, senha, endereço IP, protocolo são todos extraídos de um banco de dados para criar uma solicitação de curl para cada item.

obrigado antecipadamente!

    
por jewfro 17.03.2015 / 08:24

3 respostas

2

item é uma variável de string escalar (não uma matriz), então você deve dizer

item_arr=($item)

em vez de

item_arr=($item[@])

Se $item for The quick brown fox , então

item_arr=($item[@])

torna-se

item_arr=(The quick brown fox[@])
    
por 17.03.2015 / 08:29
1

Você está certo que o awk seria mais fácil.

Exemplo de origem /tmp/test2.txt:

$ cat /tmp/test2.txt
192.168.1.152 pwd username https
$ awk '{print $4 "://" $1 ":" $3 "@" $2 "/control/configinfo" }' /tmp/test2.txt
https://192.168.1.152:username@pwd/control/configinfo
    
por 17.03.2015 / 08:41
1

Se você quiser uma maneira mais simples de fazer isso em bash puro, assumindo que você não precisa manter o conteúdo do arquivo (Endereços IP, nomes de usuário, senhas, etc.) na memória shell (ou seja, em uma matriz), você pode fazer isso:

while read ip_address pwd username protocol
do
        echo "${protocol}://${ip_address}:$username@$pwd/control/configinfo"
done < test_file1.txt

Isso pode ser mais fácil de manter do que a solução awk .

    
por 18.03.2015 / 04:52

Tags