【问题标题】:Bash exit doesn't exitBash 退出不退出
【发布时间】:2013-08-21 14:10:53
【问题描述】:

我想知道为什么即使有明确的退出命令,这个脚本也会继续运行。

我有两个文件:

file1.txt,内容如下:

啊啊啊
bbbbbb
cccccc
dddddd
啊啊啊
ffffff
呸呸呸

file2.txt,内容如下:

111111 啊啊啊 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 

即使在打印第一个 !!!!!!!!!! 后应该退出时,我也会得到以下输出:

啊啊啊
!!!!!!!!!!!!
bbbbbb
cccccc
dddddd
啊啊啊
ffffff
!!!!!!!!!!!!
呸呸呸

exit 不应该完全结束脚本的执行吗?

【问题讨论】:

  • 我能想到的唯一原因是由于管道进入while。管道将为while 启动另一个子进程(shell),因此while 中的exit 退出该shell 并返回到原来的。

标签: bash exit nested-loops abort


【解决方案1】:

原因是管道创建子进程。改用输入重定向,它应该可以工作

#!/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)

【讨论】:

  • 谢谢...如果我需要比较命令的输出而不是文件怎么办?我怎么能使用输入重定向呢?我尝试了
  • 那么你应该使用process substitution。例如:while read -r line; do #commands; done &lt; &lt;(othercommand)
  • 你让我大吃一惊! Bash 是如此地道。
  • 帮了我很多忙!有一个猫文件|到一个while循环,它只是不想退出脚本。它只会退出循环。切换到输入重定向并且退出工作。谢谢!
【解决方案2】:

while 循环在它们各自的 shell 中运行。退出一个外壳不会退出包含的外壳。美元?可能是你的朋友:

            ...
            echo "!!!!!!!!!!"
            exit 1
        fi
    done
    [ $? == 1 ] && exit 0;
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多