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