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