Shell脚本:退出调用不能使用后引号

时间:2013-04-29 13:07:14

标签: bash shell

我正在使用exit 1在发生错误时停止执行shell脚本。

Shell脚本

    test() {
    mod=$(($1 % 10))
    if [ "$mod" = "0" ]
    then
        echo "$i";
        exit 1;
    fi
}


for i in `seq 100`
do
    val=`test "$i"`
    echo "$val"
done

echo "It's still running"

为什么它不起作用?如何停止执行shell脚本?

2 个答案:

答案 0 :(得分:2)

exit正在退出的shell是由命令替换启动的shell,而不是启动命令替换的shell。

试试这个:

for i in `seq 100`
do
    val=`test "$i"` || exit
    echo "$val"
done

echo "It's still running"

您需要显式检查命令替换的退出代码(由变量赋值传递),如果非零,则再次调用exit。


顺便说一句,您可能希望在函数中使用return而不是exit。让函数调用者决定做什么,除非错误太严重以至于没有退出shell的逻辑替代方法:

test () {
    if (( $1 % 10 == 0 )); then
        echo "$i"
        return 1
    fi
}

答案 1 :(得分:1)

exit命令仅终止执行它的(子)shell。 如果要终止整个脚本,则必须检查退出状态 ($?)函数并做出相应的反应:

#!/bin/bash

test() {
    mod=$(($1 % 10))
    if [ "$mod" -eq "0" ]
    then
        echo "$i";
        exit 1;
    fi
}


for i in `seq 100`
do
    val=`test "$i"`
    if [[ $? -eq 1 ]]
    then
      exit 1;
    fi
    echo "$val"
done

echo "It's still running"