无法正确执行这个读取语句吗?

无法正确执行这个读取语句吗?
Read a b c 
Echo $a $b $ c

它仅接受 的值a。我应该怎么做才能使我的第一个代码正常运行?

答案1

您应该给它三个以空格分隔的值:

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

答案2

您需要传递如下值:

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

这样就可以正常工作了。您只需传递以空格分隔的值即可。

答案3

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.

因此,read将从 STDIN 读取一行并根据其中包含的字符进行拆分$IFS,将每个字段分配给每个 NAME,并将潜在的过多字段分配给最后一个 NAME。

$IFS默认包含一个空格、一个制表符和一个换行符,因此默认情况下,read每次发现空格或制表符时都会拆分其输入(默认情况下,换行符用于read拆分记录,因此它将用于拆分记录而不是拆分字段,即使 中包含换行符$IFS)。

因此您应该$IFS根据想要如何分割输入来设置。

假设您想要存储空格分隔的值(因此$IFS默认情况下根据包含的字符拆分输入是可以的),您应该执行以下操作:

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

如果您想要存储以逗号分隔的值,请将的执行范围设置为$IFS,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

如果您想要存储以换行符分隔的值(或者如果您想要使用按键输入每个值并将其与下一个值分开ENTER),那么您必须读取输入三次:

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

相关内容