从while循环中退出shell脚本

17
我正在编写一个简单的shell脚本,如果在文件中找到输入的字符串,应该退出并返回0,如果没有找到,则退出并返回1。
INPSTR=$1

cat ~/file.txt | while read line
do
    if [[ $line == *$INPSTR* ]]; then
        exit 0
    fi
done

#string not found
exit 1

实际发生的是,当找到字符串时,循环退出,然后shell执行"exit 1"。在循环中完全退出shell脚本的正确方法是什么?


1
不是 while 循环弄乱了它,而是管道。true | exit 也不会退出你的脚本。 - Charles Duffy
1
子Shell的yo。您只是退出由管道生成的子Shell。 - JNevill
1
顺便提一下,BashFAQ#24与此相关:http://mywiki.wooledge.org/BashFAQ/024 - Charles Duffy
2个回答

12

您需要避免在脚本中创建子shell,方法是避免使用管道和不必要的cat命令:

INPSTR="$1"

while read -r line
do
    if [[ $line == *"$INPSTR"* ]]; then
        exit 0
    fi
done < ~/file.txt

#string not found
exit 1

否则,exit 0 只会从管道创建的子shell中退出,在循环结束后,父shell使用 exit 1

2
引用模式很好。引用赋值语句的右侧没有太多意义,但我理解你想展示良好的实践。在这一点上,我个人会使用=而不是==,以防止开发与POSIX test / [不兼容的肌肉记忆。 - Charles Duffy
如果解决了您的问题,请点击我回答左上角的勾号将其标记为已接受的答案。 - anubhava

7

您可以通过像这样使用“$?”来捕获子shell的返回代码

INPSTR=$1
cat ~/file.txt | while read line
do
if [[ $line == *$INPSTR* ]]; then
    exit 0
fi
done
if [[ $? -eq 0 ]]; then
    exit 0
else
#string not found
    exit 1
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接