gpt4 book ai didi

shell - Bourne Shell 退出将不起作用

转载 作者:行者123 更新时间:2023-12-01 10:14:46 26 4
gpt4 key购买 nike

我有以下脚本

cat $1 | while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`

if [ "`echo $line | cut -f1 -d:`" = "foo" ] && \
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exsist'
exit 1;
fi
done

一切正常,然后当脚本点击退出时,它不会继续运行。任何想法。

谢谢

最佳答案

你不需要那个反斜杠——这不是 C shell。

问题是 while 循环在子 shell 中,它退出了,但是因为它作为子 shell 运行,所以主脚本继续。

在上下文中,最简单的修复可能是:

while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exist'
exit 1
fi
done < $1

如果您必须处理多个文件('cat "$@"' 而不是 'cat $1'),那么您必须更努力更努力地工作:

cat "$@" |
while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exist'
exit 1
fi
done
[ $? != 0 ] && exit 1

这会检查由 'cat' 和 'while' 组成的管道的退出状态,这是 'while' 循环的退出状态,如果在一行的开头。

当然,还有其他方法可以检测到,例如:

grep -s -q "^foo:bar:" "$@" && exit 1

这比循环版本执行的命令少得多。 (如果您还需要允许 '^foo:bar$',请使用 egrep 而不是普通的 grep。)

关于shell - Bourne Shell 退出将不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com