为什么我的shell脚本无法正常工作?

时间:2016-06-10 16:44:46

标签: bash shell error-handling

我正在尝试测试脚本是否正确结束。 我要求用户输入是/否。如果答案是肯定的,脚本将执行某些操作,如果答案为否,则脚本将显示错误消息。 最后,如果答案是其他内容,脚本将显示另一个不同的错误消息。 当我回答是,脚本必须正确结束。 (退出代码0) 当我回答“否”时,脚本必须正确结束。 (退出代码1) 当我回答其他内容时,脚本必须不正确地结束。 (退出代码1)。我的问题是当我激发退出代码1时,脚本不会显示任何错误消息。脚本完成后我执行$?我看到退出代码是1,所以if-else运行良好,但似乎功能不起作用

#!/bin/bash
function testingexit(){
    if [ "$?" = "0" ]
        then
        echo "test ok"
    else
        echo "test error"
    fi
}
read -p "(yes/no): " answer
if [ "$answer" = "yes" ] || [ "$answer" = "YES" ]
    then
    echo "hello"
elif [ "$answer" = "no" ] || [ "$answer" = "NO" ]
    then
    echo "error1"
    exit 1
else
    echo "error2"
    exit 1
fi
#!/bin/bash
clear
function menu()
{
    echo "¿Hi what do you want to do?:"
    echo
    echo "1) opt1"
    echo "2) opt2"
    echo "2) opt3"
    echo "9) Exit"
    echo
    echo -n "Choose an option: "
}
# the function use 'return' instead of 'exit'
function get_user_input {
read -p "Do you want to start the program?: " answer        if [[ "$answer" =~ ^yes|YES$ ]] 

        then
        return 0
    elif [[ "$answer" =~ ^no|NO$ ]] 
        then
        return 1
    else
        return 2
    fi
}

# invoke
get_user_input
func_return=$?
function testingexit () {
if [ $func_return = "0" ]
    then
    echo "test ok"
else
    echo "test error"
fi
}
# default option
opt="0"

# loop  9 to exit
until [ "$opt" -eq "9" ];
do
    case $opt in
        1)
        echo "opt1"
        menu
        ;;
        2)
        echo "opt2"
        menu
        ;;
        3)
        echo "opt3"
        menu
        ;;
        *)
        menu
        ;;
    esac
read opt
done
testingexit
exit $func_return

现在我想在回答是的时候使用这个菜单。 当我回答“否”时,不应显示菜单,并且脚本必须结束显示消息“测试错误”。

3 个答案:

答案 0 :(得分:1)

你的脚本在这里工作正常:

chris@druidstudio:~⟫ ~/tmp/test.sh ; echo $?
(yes/no): no
error1
1   
chris@druidstudio:~⟫ ~/tmp/test.sh ; echo $?
(yes/no): wibble
error2
1   
chris@druidstudio:~⟫ ~/tmp/test.sh ; echo $?
(yes/no): yes 
hello
0   
chris@druidstudio:~⟫ 

我没有看到功能的重点,你从不称呼它。

答案 1 :(得分:1)

您的脚本永远不会有两个原因:

  1. 你从未调用过你的函数testingexit()
  2. 即使你打电话,它也行不通,因为你在调用exit之后无法在脚本中运行任何东西,因为'exit'会中止脚本。
  3. 为什么不按如下方式重写脚本:

    #!/bin/bash
    
    # the function use 'return' instead of 'exit'
    function get_user_input {
        read -p "(yes/no): " answer
        if [[ "$answer" =~ ^yes|YES$ ]] 
            then
            echo "hello"
            return 0
        elif [[ "$answer" =~ ^no|NO$ ]] 
            then
            echo "error1"
            return 1
        else
            echo "error2"
            return 2
        fi
    }
    
    # invoke
    get_user_input
    func_return=$?
    
    if [ $func_return = "0" ]
        then
        echo "test ok"
    else
        echo "test error"
    fi
    
    exit $func_return
    

答案 2 :(得分:1)

您的函数[{articles: 1 date:Tue Apr 26 2016 00:00:00 GMT-0500 (CDT) key:"2016-04-26T05:00:00.000Z" values:1}, {articles:1 date:Thu Apr 28 2016 00:00:00 GMT-0500 (CDT) key:"2016-04-28T05:00:00.000Z" values:1}, {articles:2 date:Sun May 08 2016 00:00:00 GMT-0500 (CDT) key:"2016-05-08T05:00:00.000Z" values:2}, {etc...}] 永远不会被调用,您需要使用trap让它在程序结束时被调用:

testingexit

您还可以考虑将if语句更改为testingexit() { ... } trap testingexit EXIT read -rp "(yes/no): " answer ... 语句:

case