我想知道为什么即使使用显式退出命令,此脚本仍会继续运行。
我有两个文件:
file1.txt
,内容如下:
aaaaaa bbbbbb cccccc dddddd eeeeee ffffff gggggg
file2.txt
,内容如下:
111111 aaaaaa 222222 333333 ffffff 444444
脚本(test.sh
)就是这样,两个嵌套循环检查第一个文件的任何行是否包含第二个文件的任何行。如果找到匹配,则中止。
#!/bin/bash
path=`dirname $0`
cat $path/file1.txt | while read line
do
echo $line
cat $RUTA/file2.txt | while read another
do
if [ ! -z "`echo $line | grep -i $another`" ]; then
echo "!!!!!!!!!!"
exit 0
fi
done
done
即使在打印完第一个!!!!!!!!!!
后退出,我也会得到以下输出:
aaaaaa !!!!!!!!!! bbbbbb cccccc dddddd eeeeee ffffff !!!!!!!!!! gggggg
exit
是不是应该完全结束脚本的执行?
答案 0 :(得分:13)
原因是管道创建了子流程。改为使用输入重定向,它应该可以工作
#!/bin/bash
while read -r line
do
echo "$line"
while read -r another
do
if grep -i "$another" <<< "$line" ;then
echo "!!!!!!!!!!"
exit 0
fi
done < file2.txt
done < file1.txt
在一般情况下,输入来自其他程序而非文件,您可以使用process substitution
while read -r line
do
echo "$line"
while read -r another
do
if grep -i "$another" <<< "$line" ;then
echo "!!!!!!!!!!"
exit 0
fi
done < <(command2)
done < <(command1)
答案 1 :(得分:4)
while循环在各自的shell中运行。退出一个shell不会退出包含的shell。 $?可能是你的朋友:
...
echo "!!!!!!!!!!"
exit 1
fi
done
[ $? == 1 ] && exit 0;
done