2013-04-29 64 views
1

我使用exit 1在错误发生时停止执行shell脚本。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”]是,如果[ “$ mod”-eq“0”] – Satya 2013-04-29 13:08:53

+0

@Satya,这不是问题。它在if条件下进入。 – kannanrbk 2013-04-29 13:11:19

+0

它会去,但因为条件从未见过它不会停止执行,你可以请尝试更改,然后看到 – Satya 2013-04-29 13:14:07

回答

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" 
2

exit正在退出的外壳是一个由命令替换开始,而不是启动命令替换的shell。

试试这个:

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

echo "It's still running" 

你需要明确检查命令替换(这是通过变量赋值传递)的退出代码,并再次调用exit如果是非零。


顺便说一句,你可能想在函数中使用return而非exit。让函数调用方决定做什么,除非错误非常严重,有以退出外壳没有逻辑的选择:

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