什么是<<<和< <()用于Bash?

时间:2015-12-28 13:56:43

标签: bash while-loop

我正在学习bash,但我无法理解这个示例代码:

while IFS= read -r line2; 
    do
        if [[ "$line1" == "$line2" ]]
        then
            (( i++ ))
        fi
    done <<< "$lines"

特别是done <<< "$lines"行是什么意思<<<

我找到了另一个例子:

while read line
  do
      echo "Word count per line: $line"
  done < <(cat list.txt | wc -w)

在这种情况下,因为它使用的是< <而不是<<<

2 个答案:

答案 0 :(得分:5)

<<<指定 here string

在您的情况下,$lines的内容会发送到while循环的标准输入。

<(...)是一种 process substitution

在您的情况下,cat list.txt | wc -w的输出将发送到while循环的标准输入。

当程序期望文件名作为参数时,进程替换非常有用。

答案 1 :(得分:1)

每当你编写一个循环时,你可以用一个带有表达式的文件的内容来提供它:

while ...; do
   # things
done < file

然后,您可以使用process substitution而不是文件本身来利用此功能。这样,您可以使用流程的结果提供while循环而无需管道。在内部,它创建了一个临时文件:

while ...; do
   # things
done < <(find -type f -name ".htaccess")

但是,为什么使用这种方法代替cat file | wc -w | while ...很重要?因为这个会打开一个子shell,所以你在while循环中设置的任何变量一旦完成就会丢失。

例如,如果你说:

$ var=5
$ seq 10 | while read v; do var=$v; done

然后变量$var在循环结束时未设置为10,但它保持不变:

$ echo $var
5

您可以在I set variables in a loop that's in a pipeline. Why do they disappear after the loop terminates? Or, why can't I pipe data to read?中了解更多相关信息。

然后,你有:

while ...; do
   # things
done <<< "$variable"

这会为while循环提供here string。也就是说,while循环会一直读取$variable的内容,直到完成为止。

例如,以下代码:

while IFS=: read -r product price; do
   echo "$product cost $price euros"
done <<< "potatos:23
kiwis:45"

将返回:

potatos cost 23 euros
kiwis cost 45 euros