2017-05-24 47 views
0

我正在製作一個安裝嚮導,但是我有很多IF語句,它讓我感到困惑,並且迷惑不解,特別是當我嘗試修復某些腳本錯誤時。如何防止這一點?這是我的腳本:如何構造bash代碼以便更容易跟蹤條件?

正如你可以看到我有很多,如果IF語句。我無法跟蹤他們。有沒有像使用HTML一樣標記或最小化它們的方法? 我正在使用Atom文本編輯器。

還是有減少IF語句的方法嗎?

#!/bin/bash 

# Author: GlitchyShadowZ 

# Name: NJDTL Install Wizard 1.0 

# Date of Last Update: 

# Date of LEGACY (Initial Release): 
clear 
echo "Would you like to start the NJDTL Install Wizard? [y/n]" 
read startYN 
if [ $startYN == y ] 
    then 
     echo "Starting Install Wizard. . ." 
     mkdir ~/.NJDTL 
    fi 
    if [ $startYN == n ] 
     then 
      echo "Are you sure you want to cancel the Install Wizard? [y/n]" 
      read CancelConfirm 
      if [ $CancelConfirm == y ] 
      then 
       echo "Cancelling Install. . ." 
       exit 
       fi 
      if [ $CancelConfirm == n ] 
      then 
       echo "Chose "n". Continuing Installation. . ." 
       exec $0 
     fi 
     fi 

[Loading Screen removed for the purpose of this post] 

if ! [ -d ~/sbin ] 
then 
echo "A Bin folder in /home/ is required for this program. Create one? [y/n]" 
read BinChoice 
    if [ $BinChoice = y ] 
    then 
     mkdir ~/testbin 
    fi 
    if [ $BinChoice = n ] 
    then 
    echo "Without a Bin Folder NJDTL Will not work. Cancelling Install." 
    fi 

else 
    echo "bin folder existent. Continuing Install. . ." 
fi 
fi 
+4

您應該修復您的縮進。嘗試將'fi'放在與'if'相同的頁邊上,它可以幫助您更好地跟蹤您的'ifs'。但是也有'elif',你可以用它來減少if語句的數量。 – quantik

+3

不要在''''''''''''要麼使用'=',要麼切換到'[['。使用shellcheck.net來檢查你的代碼。 – chepner

+1

順便說一句,構建一個安裝程序,以便在運行後有條件地顯示一大堆提示是不幸的 - 它使安裝程序很難自動化。考慮接受環境變量或命令行參數,所以有人可以在腳本中運行'createBin = 1 batch = 1。/ yourInstaller'或者'./yourInstaller --createBin --batch'(或者像Ansible這樣的自動化工具,廚師,傀儡等),並沒有提示。 –

回答

2

條件句的常見用法是把下一個關鍵字在同一行:

if [ $startYN == y ]; then 
    ... 

$startYN == n應該是一個elif的語句(與同爲$CancelConfirm == n):

if [ "$startYN" == y ]; then 
    ... 
elif [ "$startYN" == n ]; then 
    .. 
fi 

當匹配3個或更多值並且在某些情況下有2個或更多值時,一個案例塊通常更易讀:

case "$startYN" in 
    'y') 
    ... 
    ;; 
    'n') 
    ... 
    case "$CancelConfirm" in 
     'y') 
     ... 
     ;; 
     'n') 
     ... 
     ;; 
    esac 
    ;; 
esac 
+2

'='和'=='在這裏不一致。前者保證在所有符合POSIX標準的'test'或'['的實現中可用,而後者則不可用。 –

+0

(...因此,通過編輯僅使用'==',您已經使用** less **便攜式選項)。 –

+0

是的。我試圖與問題保持一致。在這種情況下'='可能更具可讀性。 – Ajb27