0

我们遇到了一个奇怪的问题。

我们有这行:

while read line2; do 
echo $line2 
done < $1 | `echo grep '.*|.*|.*|.*|.*|.*|.*|.*'` | sort -nbsk1 | cut -d "|" -f1 | uniq -d

哪个打印他们应该打印的内容。但是,当将 echo 更改为 ->

while read line2; do
echo "Hello World" 
done < $1 | `echo grep '.*|.*|.*|.*|.*|.*|.*|.*'` | sort -nbsk1 | cut -d "|" -f1 | uniq -d

它不会打印任何东西,与 $line2 不同的任何东西的结果相同。
更奇怪的是:

echo " $line2 Hello" 

将打印line2变量

echo "Hello $line2"

不打印

我已经尝试了相同的printf结果。有什么建议么 ?

4

1 回答 1

1

您编写的内容等效于以下 shell 代码:

cat $1 |
while read line2; do 
    echo $line2 
done |
`echo grep '.*|.*|.*|.*|.*|.*|.*|.*'` |
sort -nbsk1 |
cut -d "|" -f1 |
uniq -d

while read循环获取文件的内容并回显$1它们,除了删除前导和尾随空格并将内部空格替换为单个空格之外,它什么也不做。如果将echo $line2行替换为echo "Hello World",则该字符串显然不会与循环输出正在通过的 grep 命令匹配,因此不产生输出也就不足为奇了。

当您将echo行更改为 时echo " $line2 Hello",您将“Hello”添加到输入行的末尾,然后它与grep命令匹配并使用命令从字符串的末尾切下cut,因此它基本上没有最终效果是有道理的.

如果您将该echo行更改为echo "Hello $line2",则该行开头的任何数字都对 不可见sort -ns,这使您的sort调用本质上是无操作的。这可能就是您在这种情况下看不到任何内容的原因,尽管如果输入中一个接一个地出现两条相同的行,您可能会看到一些东西。(在我的机器上进行测试时,我看到了这样一条线,因为我的测试用例中恰好有两条相同的线。)

while由于循环几乎是无操作的,因此尚不清楚您要做什么。您想要做的可能更像是这样的:

grep '.*|.*|.*|.*|.*|.*|.*|.*' < $1 |
sort -nbsk1 |
cut -d "|" -f1 |
uniq -d |
while read line2; do 
    echo $line2 
done

...但我现在只是在猜测。

于 2013-05-24T19:54:35.687 回答