選擇命令顯示選項沒有問題
選擇命令顯示選項而不顯示問題。做出選擇後顯示問題。
我在腳本中有一個如下所示的函式。
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