Bash:函数重复,而不是运行指定的函数

Bash:函数重复,而不是运行指定的函数,bash,if-statement,Bash,If Statement,我正在用Python编写一个应用程序,因此我正在为Bash编写一个安装文件。我遇到了一个问题,exit()函数正在重复自身,而不是从if语句中调用install函数。这是密码 #! /bin/bash function install { if [ $proceed == "y" ]; then echo " " echo "Thank you for installing the ACS Troubleshooter!" echo "

我正在用Python编写一个应用程序,因此我正在为Bash编写一个安装文件。我遇到了一个问题,exit()函数正在重复自身,而不是从if语句中调用install函数。这是密码

#! /bin/bash

function install {
if [ $proceed == "y" ];
    then
        echo " "
        echo "Thank you for installing the ACS Troubleshooter!"
        echo " "
        echo "The next line is going to ask for your password to initialize a download"
        echo "sequence from the standard Ubuntu repositories"
        echo " "
            #sudo apt-get install testing
            mkdir ~/Desktop/ACSapplicationFolder
            sudo cp -r test ~/Desktop/ACSapplicationFolder
            sudo chown -R ~/Desktop/ACSapplicationFolder
        echo " "
        echo " "
        echo "The ACS Troubleshooter has been successfully installed."
        read -p "Press [ENTER] key to open the ACS Troubleshooter > "

            python gui.py &
elif [ $proceed == "n" ];
    then
        exit
fi
}

function bad_input {
echo "Please enter 'y' to continue the installation or 'n' to abort..."
    read -p "> " proceed
        if [ $proceed == "y" ];
            then
                install
        elif [ $proceed == "n" ];
            then
                exit
        else
            bad_input
        fi
    }


function exit {
        echo "The installation will exit."
        echo "   Please press [ENTER] to exit the installation or"
        echo "   press 'y' to reattempt installation."
        read -p "> " yes
            if [ "$yes" == "y" ];
                then
                    clear
                    install
            #else
                #exit 1
            fi
}



clear
echo " "
echo "                          *************************"
echo " "
echo "                       INSTALLATION: ACS TROUBLESHOOTER"
echo " "
echo "    The installer is going to install Python, the language this application"
echo "    is written in. Most computers don't have this installed by default so "
echo "    we need to do this before running the Troubleshooter. It's going to ask "
echo "    you to input your password one time to allow permission to install files "
echo "    to sensitive directories."
echo "                          *************************"
echo " "
echo " "

echo "Should we continue with the installation? (type 'y' or 'n' then press enter) "
#echo "> "
read -p "> " proceed

if [ $proceed == "y" ];
    then
        install
    elif [ $proceed == "n" ];
        then
            exit
    else
        bad_input

fi
唯一给我带来麻烦的函数是exit()-其他两个函数完全按照预期工作

在测试脚本时,在初始提示符处给出“n”将运行exit(),但在exit()提示符处给出“y”将重新运行install(),但它将重新发出exit()提示符…感到沮丧…有人能回答为什么这样做吗

*注意:我刚刚开始这项工作,所以我知道install()中有错误和其他一些怪癖,但我只是尝试在填写扩展指令之前测试函数…

一些提示:

  • 安装
    退出
    都是命令或shell内置。为符号指定这些名称可能会导致意外结果。我强烈建议将这些函数重命名为不太可能导致这种名称空间冲突的名称
  • set-x
    添加到脚本的开头(在
    之后)!\bin/bash
    打开非常有用的调试
  • clear
    命令将毫无帮助地清除任何提示,包括从
    set-x
    调试输出-您最好将
    clear
    命令注释掉-至少对于调试是这样
  • 注意变量的作用域-如果函数A调用函数B,那么函数B将有权访问函数A中设置的变量
话虽如此,在调用
exit
函数之前,顶级作用域将$procedure设置为“n”。如果在
exit
功能中将$yes设置为“y”,则
exit
将调用
install
install
然后立即检查
$procedure
是否为“y”,因为它在顶级作用域中被设置为“n”。因此,在这种情况下,install将始终再次调用
exit

我认为
install
中的
if
语句完全没有必要,因为已经对用户进行了轮询,并且调用了
install
之前在每个实例中检查的结果。

一些提示:

  • 安装
    退出
    都是命令或shell内置。为符号指定这些名称可能会导致意外结果。我强烈建议将这些函数重命名为不太可能导致这种名称空间冲突的名称
  • set-x
    添加到脚本的开头(在
    之后)!\bin/bash
    打开非常有用的调试
  • clear
    命令将毫无帮助地清除任何提示,包括从
    set-x
    调试输出-您最好将
    clear
    命令注释掉-至少对于调试是这样
  • 注意变量的作用域-如果函数A调用函数B,那么函数B将有权访问函数A中设置的变量
话虽如此,在调用
exit
函数之前,顶级作用域将$procedure设置为“n”。如果在
exit
功能中将$yes设置为“y”,则
exit
将调用
install
install
然后立即检查
$procedure
是否为“y”,因为它在顶级作用域中被设置为“n”。因此,在这种情况下,install将始终再次调用
exit


我认为
install
中的
if
语句是完全没有必要的,因为用户已经被轮询过了,并且在调用
install
之前在每个实例中都检查了结果。

你真的应该在发布之前精简代码,有很多东西与您的问题无关。我已经将exit()重命名为abort(),它在某种程度上起作用了。然而,当按enter键退出时,我在终端中得到这个错误。。。“/install.sh:第52行:[:==:预期的一元运算符”…这是指abort()中if语句的开头您真的应该在发布之前精简代码,有很多内容与您的问题无关。我已将exit()重命名为abort()但是,当按enter键退出时,我在终端中看到这个错误……“/install.sh:第52行:[:==:预期的一元运算符”…这是指abort()中if语句的开始感谢您提供了高质量的答案。您是对的,install中的if语句完全没有必要,但是install()的内容最初是我开始时脚本的全部内容-今晚我开始将其分解为多个函数,以添加用于中止安装和处理无效输入的扩展功能。我还将install()重命名为app_install()-新问题:pycharm一直在困扰我保存“appinstall”查字典……你知道Bash是否忽略了python没有忽略的下划线吗?再次感谢你的回答。@user2526871-不客气!我恐怕python不是我的领域,我甚至从来没有听说过pycharm,所以我觉得我在这方面帮不了你什么忙。如果你有更多问题,你可能应该以新问题的形式问他们,不要问他提供了适当的标记。感谢您提供了高质量的答案。您是对的,install中的if语句完全没有必要,但是install()的内容最初是我开始时脚本的全部内容-今晚我开始将其分解为多个函数,以添加用于中止安装和处理无效输入的扩展功能。我还将install()重命名为app_install()-新问题:pycharm一直在困扰我保存“appinstall”对于字典…您知道Bash是否忽略了python没有忽略的下划线吗?再次感谢您的回答。@user2526871-不客气!恐怕python会忽略下划线