2017-05-24 33 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