unix 从标准输入Bash逐行读取[重复]

7gcisfzg  于 2023-08-04  发布在  Unix
关注(0)|答案(2)|浏览(178)

此问题在此处已有答案

Read line by line in Bash script(7个答案)
4年前关闭。
我正在学习bash,一个考试记录是这样说的:
它应该一次读取一个输入(从标准输入)(每个条目都是一个字符串,然后以换行符结束)。
我有两个问题:
1.如何从Bash中的标准输入逐行读取?到目前为止,我使用"read string",但我不认为它一次读取一行。
1.我不知道这是否是一个愚蠢的问题,但是一旦创建了脚本,我如何才能给予脚本更多的行作为输入(当然是从标准输入读取)。例如,从stdin插入两行(helloworld)。我如何给bash脚本赋予这两行?

ecbunoof

ecbunoof1#

1.如何从Bash中的标准输入逐行读取?到目前为止,我一直使用“读取字符串”,但我不认为它一次读取一行。
read的原型是:

read [options] name[s ...]

字符串
readline的输入读入name name1 name2 ...,根据内部字段分隔符IFS)的内容分割行。IFS的默认值是' \t\n'(即spacetabnewline)。如果只为read提供一个变量,则会将整行读入该变量(除非使用-d选项将新的分隔符设置为read)。如果您提供了多个变量,(例如read -r name name1)字拆分将根据IFS的当前值发生。意思是如果你提供字符串hello world给:

read -r name


name="hello world"。另一方面,如果您向以下对象提供相同的字符串:

read -r name name1


name="hello"name1="world"。如果一行中有多余的单词,但只有两个变量,该怎么办?假设你的字符串现在是"hello big wide world",会发生什么:

read -r name name1


name="hello"name1="big wide world"string中的单词按顺序分配给您的变量,如果没有足够的变量来容纳字符串中的每个单词,最后一个变量将包含字符串中之前未分配的所有剩余单词。
您可以通过更改IFS来更改单词拆分的发生方式。仔细看看anubhava提供的答案作为一个例子。您可以自由地指定任何字符,您希望的话是分裂的。(例如解析csv文件以设置IFS=$',\n'并将单词拆分为','而不是空格)
为了确保将整行读入变量,您可以只为read提供一个变量,并设置IFS='$\n'以确保仅在newline上进行字拆分。(**注意:**将更改作为while循环的一部分提供,将IFS更改限制在该循环的范围内。举例来说:

while IFS=$'\n' read -r line; do
    # do whatever with line
done


将确保stdin上的每一行都将被读入line,同时保留循环外的正常字拆分。在循环中,你可以将每一行添加到一个数组中,就像anubhava在他的答案中显示的那样。(使用IFS=来保留所有空白)

vdzxcuhz

vdzxcuhz2#

你可以这样做:

# array to hold all lines read
lines=()

# read all lines in lines array
while IFS= read -r line; do
    lines+=( "$line" )
done < file

# read 3 more lines from stdin
for ((i=0; i<3; i++)); do
   read -rp "Enter a line: " line
   lines+=( "$line" )
done

字符串

相关问题