Como dividir o stdin em várias strings de múltiplas linhas e colocar cada uma delas em diferentes variáveis bash

1

Eu estou procurando por uma possibilidade de enviar via pipe várias strings de múltiplas linhas para um script bash e pegar cada uma delas dentro deste script. Por fim, quero armazenar cada sequência multilinha em sua própria variável.

printf "$some_multiline_string" "$another_multiline_string" | some_script.sh some_params

Dentro do bash:

#!/bin/bash
file1=$(</dev/stdin)
file2=$(</dev/stdin)
...

Como dividir o stdin em múltiplas variáveis multilinhas?

    
por playmobox 24.11.2016 / 13:44

2 respostas

3

Por que não usar o ambiente?

export some_multiline_string another_multiline_string

E então você pode acessar essas variáveis dentro do script.

Se eles forem muito grandes e excederem o tamanho máximo de um argumento / envvar ou se combinados eles excederem o tamanho máximo da lista arg + env, você poderá passá-los com pipes:

myscript 3< <(printf %s "$some_multiline_string") \
         4< <(printf %s "$another_multiline_string") args

E dentro de myscript :

IFS= read -rd '' -u3 var1
IFS= read -rd '' -u4 var2
exec 3<&- 4<&-

Ou você poderia passá-los de dentro de um único fluxo, por exemplo, no stdin do script, mas delimitado com NUL (que em bash não pode ocorrer em uma variável):

printf '%s
IFS= read -rd '' var1 && IFS= read -rd '' var2
' "$some_multiline_string" "$another_multiline_string" | myscript args

E dentro de myscript :

export some_multiline_string another_multiline_string
    
por 24.11.2016 / 14:29
2

Não tenho certeza se entendi sua pergunta, mas acho que você está procurando:

script.sh "$some_multiline_string" "$another_multiline_string" param1 param2

Então, dentro do script, você teria:

file1="$1"
file2="$2"
param1="$3"
param2="$4"

Se você realmente precisa canalizá-lo, poderia fazer algo assim:

printf '%s
#!/bin/bash
param1="$1"
param2="$2"

strings=()
while IFS= read -d '' str; do
    strings+=("$str")
done
printf 'String 1: %s\n\nString 2: %s\n' "${strings[0]}" "${strings[1]}"
%s' "$str1" "$str2" | script.sh param1 param2

E no script:

$ str1="this is
a multiline
string"

$ str2="this is
another multiline
string"

$ printf '%s
#!/bin/bash
param1="$1"
param2="$2"

strings=()
readarray -t -d '' strings

printf 'String 1: %s\n\nString 2: %s\n' "${strings[0]}" "${strings[1]}"
%s
script.sh "$some_multiline_string" "$another_multiline_string" param1 param2
' "$str1" "$str2" | foo.sh String 1: this is a multiline string String 2: this is another multiline string

Por exemplo:

file1="$1"
file2="$2"
param1="$3"
param2="$4"

Nas versões bash 4.4+, você pode fazer:

printf '%s
#!/bin/bash
param1="$1"
param2="$2"

strings=()
while IFS= read -d '' str; do
    strings+=("$str")
done
printf 'String 1: %s\n\nString 2: %s\n' "${strings[0]}" "${strings[1]}"
%s' "$str1" "$str2" | script.sh param1 param2
    
por 24.11.2016 / 14:31