此问题在此处已有答案:
Read line by line in Bash script(7个答案)
4年前关闭。
我正在学习bash,一个考试记录是这样说的:
它应该一次读取一个输入(从标准输入)(每个条目都是一个字符串,然后以换行符结束)。
我有两个问题:
1.如何从Bash中的标准输入逐行读取?到目前为止,我使用"read string"
,但我不认为它一次读取一行。
1.我不知道这是否是一个愚蠢的问题,但是一旦创建了脚本,我如何才能给予脚本更多的行作为输入(当然是从标准输入读取)。例如,从stdin插入两行(hello
和world
)。我如何给bash脚本赋予这两行?
2条答案
按热度按时间ecbunoof1#
1.如何从Bash中的标准输入逐行读取?到目前为止,我一直使用“读取字符串”,但我不认为它一次读取一行。
read
的原型是:字符串
read
将line
的输入读入name name1 name2 ...
,根据内部字段分隔符(IFS
)的内容分割行。IFS
的默认值是' \t\n'
(即space
tab
newline
)。如果只为read
提供一个变量,则会将整行读入该变量(除非使用-d
选项将新的分隔符设置为read
)。如果您提供了多个变量,(例如read -r name name1
)字拆分将根据IFS
的当前值发生。意思是如果你提供字符串hello world
给:型
name="hello world"
。另一方面,如果您向以下对象提供相同的字符串:型
name="hello"
、name1="world"
。如果一行中有多余的单词,但只有两个变量,该怎么办?假设你的字符串现在是"hello big wide world"
,会发生什么:型
name="hello"
、name1="big wide world"
。string
中的单词按顺序分配给您的变量,如果没有足够的变量来容纳字符串中的每个单词,最后一个变量将包含字符串中之前未分配的所有剩余单词。您可以通过更改
IFS
来更改单词拆分的发生方式。仔细看看anubhava提供的答案作为一个例子。您可以自由地指定任何字符,您希望的话是分裂的。(例如解析csv
文件以设置IFS=$',\n'
并将单词拆分为','
而不是空格)为了确保将整行读入变量,您可以只为
read
提供一个变量,并设置IFS='$\n'
以确保仅在newline
上进行字拆分。(**注意:**将更改作为while
循环的一部分提供,将IFS
更改限制在该循环的范围内。举例来说:型
将确保
stdin
上的每一行都将被读入line
,同时保留循环外的正常字拆分。在循环中,你可以将每一行添加到一个数组中,就像anubhava在他的答案中显示的那样。(使用IFS=
来保留所有空白)vdzxcuhz2#
你可以这样做:
字符串