我正在学习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)
在这种情况下,因为它使用的是< <
而不是<<<
答案 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
然后,你有:
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