我在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
答案 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
循环的目的是遍历word
,while
的目的是在命令成功时进行循环。它们用于不同的任务。
重定向将文件描述符更改为引用另一个文件或文件描述符。
<
更改文件描述符0(零),也称为stdin
>
更改文件描述符1(一个),也称为stdout
因此somecommand < foo
将stdin
更改为从foo
而不是从终端键盘读取。
somecommand > foo
更改stdout
以写入foo
而不是终端屏幕(如果存在foo
,它将被覆盖)。
在您的情况下,somecommand
是while
,但也可以是其他任何字符-请注意,并非所有命令都从stdin
读取,但是仍然使用<
的命令语法有效。
一个常见的错误是:
# WRONG!
while read < somefile
do
....
done
在这种情况下,somecommand
是read
,其结果是它将读取somefile
的第一行,然后继续循环的主体,返回,然后是再次读取文件的第一行!由于while
对read
所做的事情一无所知,因此对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}}