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
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?
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
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.
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