2013-11-02 58 views
1

我在Python中編寫應用程序,所以我正在編寫Bash的安裝文件。我有一個問題,exit()函數正在重複它自己,而不是從if語句中調用安裝函數。下面的代碼...Bash:功能重複,而不是運行指定的功能

#! /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 

給我找麻煩的唯一功能是退出() - 其他兩個正在完全按照預期...

當測試腳本,賦予「N」的初始提示運行exit(),但在exit()提示符處輸入'y'應該重新運行install(),但它會重新發出exit()提示...變得沮喪......任何人都可以回答爲什麼這樣做?

*注:我剛開始這讓我知道在安裝的)錯誤(和其他一些怪癖,但我只是想在自己的擴展指令填充之前測試的功能...

+0

你真的應該在發佈前剝離你的代碼,有很多東西與你的問題無關。 – user2719058

+0

我已經改名退出()中止(),它有點工作。但是,當按Enter鍵退出時,我在終端中得到這個錯誤... ...「./ install.sh:line 52:[:==:unary operator expected」... 這是指在中止if語句的開始() – user2526871

回答

1

一些提示:

  • installexityes都是命令或shell內建命令。給你的符號這些名字很可能會導致意想不到的結果。我強烈建議將這些函數重命名爲不太可能導致這樣的命名空間衝突的東西。
  • 加入set -x到腳本的開始(後!#/bin/bash)開啓非常有用的調試
  • clear命令將無助地清除掉任何提示,包括set -x調試輸出 - 你會做得很好評論的clear命令出 - 至少用於調試。
  • 小心你的變量範圍 - 如果函數A調用函數B,則函數B將有機會獲得在功能A.設置變量

話雖如此,頂層範圍將有$繼續在調用你的exit函數之前設置爲「n」。如果在exit函數中將$ yes設置爲「y」,則exit將調用installinstall然後立即檢查以確定$proceed是否爲「y」,因爲它在頂級範圍中設置爲「n」,所以不會。因此,在這種情況下安裝將總是再次調用exit

我認爲install中的if語句是完全不必要的,因爲用戶已被輪詢,並且在調用install之前的每個實例中檢查結果。

+0

感謝您的高質量答覆。你說得對,安裝if語句完全沒有必要,然而,install()的內容最初是我開始時腳本的整個主體 - 今晚我開始將它分解成函數以添加擴展功能以便中止安裝和處理無效輸入。我還將install()更名爲app_install() - 新問題:pycharm一直在竊聽我關於將「appinstall」保存到字典中的問題......你知道Bash是否忽略python沒有的下劃線嗎?再次感謝您的回覆。 – user2526871

+0

@ user2526871 - 不客氣!我擔心蟒蛇不是我的地區,我從來沒有聽說過pycharm,所以我不認爲我真的可以幫忙。如果你有更多的問題,你應該問他們作爲新問題,並附上適當的標籤。 –