BASH-echo问题,在读取参数时不会打印任何内容

BASH-echo问题,在读取参数时不会打印任何内容,bash,echo,Bash,Echo,我们遇到了一个棘手的问题 我们有以下几行: while read line2; do echo $line2 done < $1 | `echo grep '.*|.*|.*|.*|.*|.*|.*|.*'` | sort -nbsk1 | cut -d "|" -f1 | uniq -d 将打印line2变量 echo "Hello $line2" 不打印 我用printf尝试过同样的方法,结果也一样。 有什么建议吗?您编写的代码相当于以下shell代码: cat $1 | wh

我们遇到了一个棘手的问题

我们有以下几行:

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

echo "Hello $line2"
不打印

我用
printf
尝试过同样的方法,结果也一样。
有什么建议吗?

您编写的代码相当于以下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
grep.*..*..*..*.*.*.*.*.*.*.*.*.<$1|
排序-nbsk1|
切割-d“|”-f1|
uniq-d|
读第2行时;做
echo$line2
完成

。。。但我只是在猜测这一点。

我建议您编写更少的模糊shell脚本。你好像在尝试复杂的非行动计划。无论如何,
“Hello World”
与grep模式不匹配,因此显然不会生成任何输出。Hello World不应与grep模式匹配,它是while read循环中的打印..:\while read循环通过grep.rici进行管道传输是正确的,要在
grep
&之后执行
read
,请运行
done<他们说的是命令被管道分割。您有
command1 | command2 | command3 |……
,其中您的“command1”在读取第2行时为
;执行echo“Hello World”完成<$1
,您的命令2是
echo grep.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.
,您的“command3”是
排序
,依此类推。因此,while输出的任何内容都将通过管道传输到其他命令,而您想要的恰恰相反:使用“完成”之后的所有内容作为while的输入。这就是为什么Wrikken建议你用括号把它分组。嗯,我试着用所有管道来获得一个“排序输入”,然后用while循环逐行读取输入。你的解释很好,真的给了我很多额外的东西,我一醒来就会尝试实施它。!
cat $1 |
while read line2; do 
    echo $line2 
done |
`echo grep '.*|.*|.*|.*|.*|.*|.*|.*'` |
sort -nbsk1 |
cut -d "|" -f1 |
uniq -d
grep '.*|.*|.*|.*|.*|.*|.*|.*' < $1 |
sort -nbsk1 |
cut -d "|" -f1 |
uniq -d |
while read line2; do 
    echo $line2 
done