了解如何从文件构造时将输入重定向到

时间:2019-04-16 12:08:16

标签: bash

我在bash脚本中遇到了“ while read”循环的语法

$> while read line; do echo $line; done < f1 # f1 is a file in my current directory

将逐行打印文件。

我在bash GNU手册https://www.gnu.org/software/bash/manual/中搜索“边读边读”

简短地讲,尽管其他“教程站点”提供了一些用法示例,但我仍然想了解该构造的完整语法选项。

它也可以用于“ for”循环吗? 像

for line in read; do echo $line; done < f1

1 个答案:

答案 0 :(得分:0)

while循环的语法是

while list-1; do list-2; done

其中list-1是一个或多个命令(通常是一个),并且在list-1成功(返回值为零)时循环继续,而list-2是循环的“主体”

for循环的语法是不同的:

for name in word;  do list ; done

其中word通常是字符串列表,不是命令(尽管可以使用返回word的命令来破解它)。

for循环的目的是遍历wordwhile的目的是在命令成功时进行循环。它们用于不同的任务。

重定向将文件描述符更改为引用另一个文件或文件描述符。

<更改文件描述符0(零),也称为stdin

>更改文件描述符1(一个),也称为stdout

因此somecommand < foostdin更改为从foo而不是从终端键盘读取。

somecommand > foo更改stdout以写入foo而不是终端屏幕(如果存在foo,它将被覆盖)。

在您的情况下,somecommandwhile,但也可以是其他任何字符-请注意,并非所有命令都从stdin读取,但是仍然使用<的命令语法有效。

一个常见的错误是:

# WRONG!
while read < somefile
do
    ....
done

在这种情况下,somecommandread,其结果是它将读取somefile的第一行,然后继续循环的主体,返回,然后是再次读取文件的第一行!由于whileread所做的事情一无所知,因此对read并不了解或不感兴趣,只会返回其成功或失败的返回值。 (REPLY使用变量$,如果您未指定变量)

重定向示例($ cat > file1 111111 <CTRL+D> $ cat > file2 222222 <CTRL+D> 表示提示):

cat
如果未指定文件名,则

stdin<CTRL+D>读取,因此它从键盘读取。而不是写入屏幕,我们将重定向到文件。 stdin表示从键盘发送的文件结束。

这会将$ cat < file1 111111 重定向为从文件读取:

$ cat < file1 file2
222222

你能解释一下吗?

{{1}}