在bash脚本中,我在关闭循环时会看到几个带有这些重定向符号的while语句。 我知道如果我用“done< file”结束它,我将文件重定向到while语句中命令的stdin。但其他人意味着什么?
如果有人可以举例说明,我将不胜感激。
答案 0 :(得分:3)
使用 text.txt
文件1aa
2bb
3cc
重定向:
$ cat < text.txt
1aa
2bb
3cc
这里的文件:
$ cat << EOF
> 1AA
> 2BB
> EOF
1AA
2BB
这里是字符串:
$ cat <<< 1aaa
1aaa
答案 1 :(得分:2)
第一个表单<
是input redirection。它与<<
和<<<
有些不同,后者是here document的两个变体。
第一种形式<
主要用于将文件内容重定向到命令或进程。它是一个命名的FIFO,因此传递给接受文件参数的命令的文件。
cmd < file
将打开名为file
的文件并创建一个新文件名以打开和阅读。 cmd file
和cmd < file
之间的差异是传递给cmd
的名称,在第二种情况下是named pipe的名称。
您也可以进行流程替换:
cmd <(process)
一个示例用法是比较两个目录:
diff <(ls dir1) <(ls dir2)
在这种情况下,命令ls dir1
和ls dir2
已将输出重定向到类似于流的文件,然后由diff
读取,就像这两个文件一样。
您可以通过传递给echo
进程替换来查看文件设备的名称:
$ echo <(ls)
/dev/fd/63
由于echo
不支持打开文件,因此它只打印FIFO的名称。
这里的文档更容易演示。 <<
表单有一个“限制字符串”,不包含在输出中:
$ cat <<HERE
> line 1
> line 2
> line 3
> HERE
line 1
line 2
line 3
HERE
是一个唯一的字符串,必须在它自己的行上。
'here string'或<<<
表单不需要<<
表单的分隔字符串,并且在一行中:
$ cat <<< 'line 1'
line 1
您还可以扩展参数:
$ v="some text"
$ cat <<< "$v"
some text
但不是其他形式的shell扩展:
支持扩张:
$ echo a{b,c,d}e
abe ace ade
$ cat <<< a{b,c,d}e
a{b,c,d}e
给出一个'泛型'Bash while循环,逐行读取输入:
while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done
有几种方法可以将输入提供给该循环。
首先,您可以重定向文件。对于demo,创建一个6行文件:
$ seq 6 > /tmp/6.txt
将文件的输入重定向到循环:
while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done </tmp/6.txt
'1'
'2'
'3'
'4'
'5'
'6'
或者,第二个例子,您可以使用重定向直接读取seq
的输出:
$ while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done < <(seq 3)
'1'
'2'
'3'
(请注意额外的<
以及此表单的空格)
或者,第三个例子,您可以使用由CR分隔的“HERE”文档:
while IFS= read -r line || [[ -n $line ]]; do printf "'%s'\n" "$line"; done <<HERE
1
2 3
4
HERE
'1 '
'2 3'
' 4'
返回<{1}} 仅处理文件,您可以使用流程替换和HERE文档或流程替换和重定向在自由文本上使用diff
或程序的输出。
假设:
diff
通常你需要有第二个文件来将自由文本与该文件进行比较。您可以使用HERE文档和流程替换来跳过创建单独的文件:
$ cat /tmp/f1.txt
line 1
line 2
line 3
答案 2 :(得分:1)
command < foo
将文件foo
重定向到command
的标准输入。
command << foo
blah 1
blah 2
foo
此处文档:将foo
的以下行发送到command
的标准输入。
command <<< foo
下面串。字符串foo
将发送到command
的标准输入。