2013-04-29 47 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 
}