BASH - 回声问题,除了阅读参数外不打印任何东西

时间:2013-05-24 17:22:25

标签: bash echo

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

我们有这样一句话:

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

打印出应该打印的内容。但是,当将回声更改为 - &gt;

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尝试了同样的结果。 有什么建议吗?

1 个答案:

答案 0 :(得分: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来电基本上不合乎业-OP。这可能就是你在这种情况下没有看到任何东西的原因,尽管你可能会看到一些东西,如果两个相同的行一个接一个地出现在输入中。 (在我的机器测试中,我看到一条这样的线,因为在我的测试用例中,我碰巧有两条相同的线。)

由于while循环几乎是无操作,所以你要做的事情并不完全清楚。你想要做的事情更像是这样:

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

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