Script de shell: \ n problema relacionado para dividir uma linha simples [closed]

0

Isso é um snippet de script de shell:

KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $ENV_FILE_LOCATION)
echo ${KVS_VARIABLES}

for kv in ${KVS_VARIABLES}
do
  echo $kv
  key=$(echo $kv | awk -FS=" " '{print $1}')
  value=$(echo $kv | awk -FS=" " '{print $2}')

  echo "key: $key | value: $value"
done

Espero uma saída como:

key: VAR1 | value: VAL1
...

No entanto, estou recebendo isso:

VAR1 VAL1 VAR2 VAL2 VAR3 VAL3
VAR1
key: VAR1 | value: 
VAL1
key: VAL1 | value: 
VAR2
key: VAR2 | value: 
VAL2
key: VAL2 | value: 
VAR3
key: VAR3 | value: 
VAL3
key: VAL3 | value:

EDITAR

$ echo "$KVS_VARIABLES" ->
VAR1 VAL1
VAR2 VAL2
VAR3 VAL3
    
por Jordi 28.06.2018 / 09:53

3 respostas

1

Você precisa especificar IFS como newline , por padrão o separador de arquivos de entrada ( IFS) inclui um espaço e, portanto, seu loop for está se comportando dessa maneira

KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $ENV_FILE_LOCATION)
echo ${KVS_VARIABLES}
IFS=$(echo -en "\n\b")
for kv in ${KVS_VARIABLES}
do
  echo $kv
  key=$(echo $kv | awk  '{print $1}')
  value=$(echo $kv | awk  '{print $2}')    
  echo "key: $key | value: $value"
done
    
por 28.06.2018 / 10:37
1

Tente:

#!/bin/bash

KVS_VARIABLES=$(echo -e "VAR1 VAL1\nVAR2 VAL2\nVAR3 VAL3\n")
echo "KVS_VARIABLES=[${KVS_VARIABLES}]"

while read -r kv; do
        echo "kv = ${kv}"
        key=$(echo $kv | awk '{print $1}')
        value=$(echo $kv | awk '{print $2}')

        echo "key: ${key} | value: ${value}"
done <<< "${KVS_VARIABLES}"

Você deve receber

KVS_VARIABLES=[VAR1 VAL1
VAR2 VAL2
VAR3 VAL3]
kv = VAR1 VAL1
key: VAR1 | value: VAL1
kv = VAR2 VAL2
key: VAR2 | value: VAL2
kv = VAR3 VAL3
key: VAR3 | value: VAL3
    
por 28.06.2018 / 10:40
0

Como Arushix aponta , um dos problemas com o código é que read divide a entrada em os valores na variável do shell IFS (espaço, tabulação e nova linha por padrão).

No entanto, não posso deixar de notar que você está analisando as variáveis no arquivo original várias vezes; primeiro pelo primeiro script awk e, em seguida, novamente com read e, finalmente, uma terceira vez com echo + awk . Cada uma dessas etapas pode lançar seu próprio conjunto de erros.

Se você quiser apenas validar as atribuições de variáveis e imprimir os pares chave / valor:

if ! awk -F '=' 'NF != 2 { exit 1 } { printf("key: %s | value: %s\n", $1, $2) }' "$conffile"; then
    echo 'Failed' >&2
    exit 1
fi

Dado o arquivo de entrada

VAR1=VAL1
VAR2=VAL2
VAR3=VAL3
VAR4=VAL4

Isso imprimirá

key: VAR1 | value: VAL1
key: VAR2 | value: VAL2
key: VAR3 | value: VAL3
key: VAR4 | value: VAL4

Com uma linha extra lendo apenas BOO no final do arquivo de entrada, a saída seria

key: VAR1 | value: VAL1
key: VAR2 | value: VAL2
key: VAR3 | value: VAL3
key: VAR4 | value: VAL4
Failed

Além de NF == 2 , você pode querer incluir uma verificação de nomes de variáveis válidos, etc:

if ! awk -F '=' 'NF != 2 || $1 !~ /^[A-Za-z][A-Za-z0-9]+$/ { exit 1 } { printf("key: %s | value: %s\n", $1, $2) }' "$conffile"; then
    echo 'Failed' >&2
    exit 1
fi
    
por 28.06.2018 / 10:51