1

ダイアログを使用してユーザーに質問を促すスクリプトを作成しています。手順の 1 つは、コマンドを実行して情報を生成することです。失敗した場合に備えてifステートメントがあります。ユーザーが再実行できるように失敗した場合に備えて、やりたいことです。それを行う方法について少し迷った。

スクリプト自体

#!/bin/bash

#Generating UID

UID_GREP=${UID_GREP=dialog}
$UID_GREP --title "Appliance Imaging Script" --clear \
    --yesno  "Begin Generate UID for Appliance:" 10 30
    case $? in 
    0)  
      #uid generate script
      /usr/share/bin/create >/tmp/appliance_run.log 2>&1
      ;;  
    1)  
      clear
      echo "exiting"
      exit;;
    255)
      clear
      echo "ESC Pressed... Exiting"
      exit;; 
      esac

 #if Generation of UID fails
   if [ $? != 0 ] ; then
      UID_FAIL=${UID_FAIL=dialog}
      $UID_FAIL --title "UID Genenration failed" --clear \
          --yesno "UID failed to genenerate, would you like to try again" 10 30
          case $? in
    0)  
       #loopback to $UID_GREP

      ;;  
    1)  
      clear
      echo "exiting"
      exit;;
    255)
      clear
      echo "ESC Pressed... Exiting"
      exit;;
      esac

 fi

つまり、基本的に、「#loopback to $UID_GREP」と表示されている場合は、[はい] を選択して UID_GREP ダイアログ画面にループバックするようにします。

ありがとうございました。

4

3 に答える 3

1

whileすべてをループ内に入れるだけです。が正常に実行されたらcreate、break コマンドを使用してループを終了します。2 番目のcaseステートメントは、最初のステートメントのデフォルト句に入れ子にすることができ、ユーザーが再試行することを選択した場合にループを繰り返させるために単純に失敗することができます。

while true; do
    #Generating UID

    UID_GREP=${UID_GREP=dialog}
    $UID_GREP --title "Appliance Imaging Script" --clear \
        --yesno  "Begin Generate UID for Appliance:" 10 30
    case $? in 
        0)  
          #uid generate script
          /usr/share/bin/create >/tmp/appliance_run.log 2>&1
          break
          ;;  
        1) clear; echo "exiting"; exit
           ;;
        255) clear; echo "ESC Pressed... Exiting"; exit
           ;; 

        *)  # All other non-zero exit statuses
            UID_FAIL=${UID_FAIL=dialog}
            $UID_FAIL --title "UID Genenration failed" --clear \
                --yesno "UID failed to genenerate, would you like to try again" 10 30
            case $? in
              1) clear; echo "exiting"; exit
                 ;;
              255) clear; echo "ESC Pressed... Exiting"; exit
                 ;;
            esac
            ;;
    esac
done
于 2013-09-10T00:43:05.877 に答える
1

おそらく、これはあなたが必要としていたフォーマットです:

#!/bin/bash

# Generating UID

while :; do
    UID_GREP=${UID_GREP=dialog}
    "$UID_GREP" --title "Appliance Imaging Script" --clear \
        --yesno  "Begin Generate UID for Appliance:" 10 30
    case $? in
    0)
        # uid generate script
        /usr/share/bin/create >/tmp/appliance_run.log 2>&1
        # if Generation of UID fails
        if [[ $? != 0 ]]; then
            UID_FAIL=${UID_FAIL=dialog}
            "$UID_FAIL" --title "UID Genenration failed" --clear \
                --yesno "UID failed to genenerate, would you like to try again" 10 30
            case $? in
            0)
                continue 2
                ;;
            1)
                clear
                echo "exiting"
                exit
                ;;
            255)
                clear
                echo "ESC Pressed... Exiting"
                exit
                ;;
            *)
                # What do we do with other codes?
                ;;
            esac
        fi
        break
        ;;
    1)
        clear
        echo "exiting"
        exit
        ;;
    255)
        clear
        echo "ESC Pressed... Exiting"
        exit
        ;;
    *)
        # What do we do with other codes?
        ;;
    esac
done

# Continues here after success. All other failure or cancellations make the code exit.
于 2013-09-10T00:56:13.087 に答える
1

基本的に、アプリケーション フローを制御するアプリケーションの「メイン関数」、基本的にはループを作成する必要があります。そして、すべてのダイアログを分離して機能を分離します。また、適切な場合は、実際の操作を別の関数に分離することも検討してください。

#!/bin/bash

# Variable that holds information whether we have generated the UID.
uid_generated=0
loop_count=0    

generate_uid() {
    loop_count=$(( $loop_count + 1 )) #This can be used to check how many times we have failed
    echo "generating UI, execution $loop_count" >> log.txt #For testing purposes
    /usr/share/bin/create >/tmp/appliance_run.log 2>&1

    # Check our result
    if [[ $? -eq 0 ]]; then
        uid_generated=1
    fi

}

initial_dialog() {
    UID_GREP=${UID_GREP=dialog}
    $UID_GREP --title "Appliance Imaging Script" --clear \
    --yesno  "Begin Generate UID for Appliance:" 10 30
    case $? in
    0)
        #uid generate script
        generate_uid
    ;;
    1)
        clear
        echo "exiting"
        exit
    ;;
    255)
        clear
        echo "ESC Pressed... Exiting"
        exit
    ;;
    esac
}

check_result() {
    #if Generation of UID fails
    if [ $? != 0 ] ; then
        UID_FAIL=${UID_FAIL=dialog}
        $UID_FAIL --title "UID Genenration failed" --clear \
        --yesno "UID failed to genenerate, would you like to try again" 10 30

        case $? in
        0)
            #loopback to $UID_GREP
            generate_uid
            ;;
        1)
            clear
            echo "exiting"
            exit
            ;;
        255)
            clear
            echo "ESC Pressed... Exiting"
            exit
            ;;
        esac
    fi
}

# First, show the initial dialog
initial_dialog

# Then we enter our application loop, this might not be exactly what you want, but idea is
# to have variables that control the execution states.
# So you could have eternal while here as well, and other variables define which screen
# should be shown at what time, but to show that this is correct, I do this
while [ $uid_generated -eq 0 ]
do
    generate_uid

    # Consider showing some other screen, or other information in this dialog
    # For example informing user that "we have failed once, and re-generating etc"
    check_result
done

echo "UID generation done" #This will end the program

これはほんの一例ですが、うまくいきます。uid生成を何回実行したかはlog.txtで確認できます。使い慣れたように見えて違いがわかるように、形式はあなたのものに似たままにしましたが、アプリケーション フローを制御する外部変数をもっと多くしたい場合があります。

エラー チェックは generate_uid 関数で行われるため、チェック結果で失敗コードをチェックする必要はもうありません。その機能は純粋に、失敗したことをユーザーに通知するためのものです..しかし、元のコンテンツを同じに保つために変更しませんでした.

ただし、アプリケーション ロジックを UI ロジックとは別に移動することをお勧めします。

于 2013-09-10T00:51:16.567 に答える