bash:关闭循环时“done< foo”,“done<< foo”和“done<<< foo”之间有什么区别?

时间:2016-11-03 20:48:26

标签: bash syntax sh

在bash脚本中,我在关闭循环时会看到几个带有这些重定向符号的while语句。 我知道如果我用“done< file”结束它,我将文件重定向到while语句中命令的stdin。但其他人意味着什么?

如果有人可以举例说明,我将不胜感激。

3 个答案:

答案 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 filecmd < file之间的差异是传递给cmd的名称,在第二种情况下是named pipe的名称。

您也可以进行流程替换:

cmd <(process)

一个示例用法是比较两个目录:

diff <(ls dir1) <(ls dir2)

在这种情况下,命令ls dir1ls 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的标准输入。