Não é possível executar corretamente estas instruções de leitura?

1
Read a b c 
Echo $a $b $ c

Leva apenas o valor de a . O que devo fazer para que meu primeiro código seja executado corretamente?

    
por Dixit Malviya 05.01.2016 / 04:54

3 respostas

0

Você deve fornecer três valores separados por espaços:

echo 1 2 3 | read a b c; echo $a; echo $b; echo $c
1
2
3
    
por Jshura 05.01.2016 / 06:20
0

Você precisa passar valores como este:

$ read a b c
1 2 3
$ echo $a $b $c
1 2 3

Desta forma, funciona bem. Você só precisa passar valores separados por espaço.

    
por Yo Yo Saty Singh 05.01.2016 / 08:52
0

De help read :

    Reads a single line from the standard input, or from file descriptor FD
    if the -u option is supplied.  The line is split into fields as with word
    splitting, and the first word is assigned to the first NAME, the second
    word to the second NAME, and so on, with any leftover words assigned to
    the last NAME.  Only the characters found in $IFS are recognized as word
    delimiters.

Portanto, read lerá uma linha de STDIN e dividirá os caracteres contidos em $IFS , atribuindo cada campo a cada NAME e campos em potencial excedentes ao último NAME.

$IFS por padrão contém um espaço, uma tabulação e uma nova linha, então por padrão read dividirá sua entrada toda vez que um espaço ou uma tabulação for localizada (a nova linha por padrão é usada por read para dividir registros, de modo que ele será usado para dividir os registros em vez de dividir os campos, mesmo que uma nova linha esteja contida em $IFS ).

Portanto, você deve definir $IFS com base em como deseja dividir a entrada.

Assumindo que você deseja armazenar valores separados por espaço (e, portanto, dividir a entrada nos caracteres contidos em $IFS por padrão, tudo bem), você deve fazer algo assim:

read a b c
echo $a $b $c
$ read a b c
aaa bbb ccc
$ echo $a $b $c
aaa bbb ccc
$ echo $a
aaa
$ echo $b
bbb
$ echo $c
ccc

Se você deseja armazenar, por exemplo valores separados por vírgula, defina $IFS para , para o escopo da execução de read :

IFS=, read a b c
echo $a $b $c
$ IFS=, read a b c
aaa,bbb,ccc
$ echo $a $b $c
aaa bbb ccc
$ echo $a
aaa
$ echo $b
bbb
$ echo $c
ccc

Se você quiser armazenar valores separados por nova linha (ou se você quiser inserir cada valor separando-o do próximo usando um pressionamento de tecla ENTER ), você terá que ler o entrada três vezes:

read a
read b
read c
echo $a $b $c
$ read a
aaa
$ read b
bbb
$ read c
ccc
$ echo $a $b $c
aaa bbb ccc
$ echo $a
aaa
$ echo $b
bbb
$ echo $c
ccc
    
por kos 05.01.2016 / 09:13