Select

選擇命令顯示選項沒有問題

  • December 6, 2021

選擇命令顯示選項而不顯示問題。做出選擇後顯示問題。

我在腳本中有一個如下所示的函式。

function start_AppNode
{
   #   Define local variables for all the inputs
   local DName_l=$1
   local ASName_l=$2
   local ANName_l=$3
   
   echo "Do you wish to start the AppNode $ANName_l on AppSpace $ASName_l in Domain $DName_l ?"
   select yn in "Yes" "No"; do
       case $yn in
           Yes ) 
               #print_log $yn
               OUTPUT="`./appadmin start -d $DName_l -as $ASName_l anode $ANName_l`"
               if [[ "$OUTPUT" == *"$SuccessMessage_AppNode_Start"* ]]; then
                   echo "Started"
               else
                   echo "Failed"
               fi
               break;;
           No ) echo "Failed"; break;;
       esac
   done
}

當我在導入此腳本的其他腳本中呼叫該腳本時,我首先獲得選項而不顯示問題“ Do you wish to start the AppNode $ANName_l on AppSpace $ASName_l in Domain $DName_l ?

它顯示了做出選擇後的問題。請參閱下面的輸出螢幕截圖。感謝是否有人可以幫助我理解如何讓它首先顯示問題?

在此處輸入圖像描述

更新:問題是由於變數分配。我將函式的輸出分配給一個變數。如果我在沒有將返回值分配給變數的情況下執行該函式,它就可以工作。如何將返回值分配給變數並且仍然在選項之前顯示問題部分?

我將忽略程式碼不會生成您展示給您的輸出這一事實,而是專注於如何與使用者互動。

select語句在標準錯誤流上顯示菜單和提示。習慣上在此流上與使用者互動,不要使使用者互動成為程序標準輸出流的一部分(這可能會混淆從函式讀取輸出的下游程序)。

我建議您在標準錯誤流而不是標準輸出流上將問題輸出給使用者。這是有道理的,因為您的問題與使用者互動有關。

某些情況下,標準輸出和標準錯誤流可能會在終端中交錯出現。使用單個流與使用者互動可以避免這種情況。

我還建議您使用printf而不是echo在必須輸出變數數據時立即使用:

start_AppNode () {
   local DName_l="$1"
   local ASName_l="$2"
   local ANName_l="$3"

   local cmd=( ./appadmin start -d "$DName_l" -as "$ASName_l" anode "$ANName_l" )
   
   printf 'Do you wish to start the AppNode %s on AppSpace %s in Domain %s?\n' \
       "$ANName_l" "$ASName_l" "$DName_l" >&2
   
   local PS3='Start AppNode? '
   select yn in "Yes" "No"; do
       [[ $REPLY == 1 ]] && "${cmd[@]}"
       break
   done |
   if grep -q -F -e "$SuccessMessage_AppNode_Start"; then
       echo Started
   else
       echo Failed
   fi >&2
}

如果您希望函式提供可以在腳本的某些主要部分中使用的退出狀態:

start_AppNode () {
   local DName_l="$1"
   local ASName_l="$2"
   local ANName_l="$3"

   local cmd=( ./appadmin start -d "$DName_l" -as "$ASName_l" anode "$ANName_l" )
   
   printf 'Do you wish to start the AppNode %s on AppSpace %s in Domain %s?\n' \
       "$ANName_l" "$ASName_l" "$DName_l" >&2
   
   local PS3='Start AppNode? '
   select yn in "Yes" "No"; do
       [[ $REPLY == 1 ]] && "${cmd[@]}"
       break
   done |
   grep -q -F -e "$SuccessMessage_AppNode_Start"
}

然後,稍後:

if start_AppNode "$dn" "$as" "$an"; then
   echo 'Started, good'
else
   echo 'Failed, bad'
fi

if語句讀取並作用於函式的退出狀態。函式的退出狀態是函式中執行的最後一條語句的退出狀態。這將是grep -q電話。如果在語句的輸出中找到任何字元串,則為真(零),如果未找到該字元串,則為**假(非零)。該語句有條件地輸出 的輸出,或者根本不輸出,這取決於使用者做出的選擇、給函式的參數以及影響 輸出的任何其他數量的外部因素。$SuccessMessage_AppNode_Start``select``select``./appadmin``./appadmin

引用自:https://unix.stackexchange.com/questions/680402