Use variáveis em string aqui

1

Para alimentar a entrada para um script interativo, estou usando uma string aqui:

script <<< $'1 2\n3 4\n5 6\nq'

Isso efetivamente entra

1 2
3 4
5 6
q

no script. Mas como posso substituir um deles por uma variável?

script <<< $'$var 2\n3 4\n...'

não funciona ...

    
por snurden 27.05.2016 / 10:20

2 respostas

6

Essa não é a string aqui, é citando ANSI-C :

Words of the form $'string' are treated specially. ... The expanded result is single-quoted, as if the dollar sign had not been present.

Então, o que você tem é uma string de aspas simples à direita de <<< . Essa string é tomada como a string aqui, sem processamento adicional.

Não há necessidade de usar apenas um único conjunto de citações em torno da palavra inteira, no entanto. Você pode usar várias partes citadas (ou palavras únicas sem aspas) reunidas:

script <<< "$var 2"$'\n'"3 4"$'\n'"5 6"$'\n'q

fará o que você queria.

Como alternativa, você pode excluir os espaços na barra invertida, em vez de citar "1 2" .

Você também pode usar echo -e com um tubo normal:

echo -e "$var 2\n3 4\n5 6\nq" | script

ou printf :

printf '%s 2\n3 4\nq' "$var" | script

-e é necessário para ativar o processamento de escape nos argumentos de echo . printf faz isso por padrão, mas tem seu próprio sistema de interpolação ( printf "$var 2\n3 4\nq" também funcionará, mas é problemático se $var puder conter caracteres de escape).

    
por 27.05.2016 / 11:36
0

A citação de $'...' ANSI-C resulta em uma seqüência de caracteres "com aspas simples".
Dentro de uma única string, as variáveis de string não são expandidas:

$ var=13

$ echo 'test $var'
test $var

Você precisa tirar a variável dessa estrutura. A maneira mais fácil é a IMO:

$  printf -v val '%s 2\n3 4\n5 6\nq' "$var"
13 2
3 4
5 6
q

O formato para printf é muito semelhante ao que você tinha antes, e o %s é substituído pelo valor da variável. Para obter o resultado em uma variável, podemos usar a capacidade de bash printf de definir uma variável:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"
$ script <<< "$val"

Tudo em uma linha:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"; script <<< "$val"
    
por 28.05.2016 / 13:05